• vmware虚拟机搭建Kgdb环境


    参考internet上的一篇文章《VMware下搭建kgdb环境》,我在SUSE11环境下进行试验。

    一、    系统环境:
    1、VMware版本6.5。
    2、两台虚拟机,均为suse11操作系统,运行内核为2.6.32

    二、虚拟机配置:
    被调试的系统为server(target machine),调试的系统为client(development machine),在关机状态下,为两台系统各添加一个串口Serial Port,注意创建虚拟机的时候可能会需要手动add Serial设备。

    Server端配置:

    client端配置:

    串口设置完毕,然后开机进入系统,在server的终端输入:cat /dev/ttyS0 .
    在client的终端输入echo hello > /dev/ttyS0,
    如果server上显示hello,说明串口设置成功。

    三、client端编译内核(选上kgdb选项)。
    此步的目的是为了把kgdb功能编译进内核,因为正在运行的内核中是没有kgdb功能的。
    进入client,把内核拷到/work目录下:
      cd /work/linux-2.6.32
      cp /boot/config-2.6.32.12-0.7-default  . //利用原系统的config配置
      make clean //清除生成的中间文件
     修改Makefile文件中的:EXTRAVERSION = -xhawk(你自己给新内核取的名字)
      make menuconfig
    •File System --> 下面把ext3,ext2都编译进内核(就是把前面的M变成*) 
    •Kernel Hacking --> 
                 选中Compile the kernel with frame pointers
                 选中KGDB:kernel debugging with remote gdb 
                 并确认以下两项也是选中的(他们应该默认是选中的) 
                 选中 kernel debugging 
                 选中 Compile the kernel with debug info 
    •对于其它选项,请按实际情况,或你的要求定制. 
    •保存退出

      修改编译选项:
    ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
    CFLAGS += -O //原来是-Os 这个比 –O2 优化的还厉害呢
    else
    CFLAGS += -O2
    Endif

    ifdef CONFIG_DEBUG_INFO
    CFLAGS += -g -ggdb
    Endif
      make (编译内核)
      make modules_install (安装内核模块)
      make install (安装内核)
     此时client端已经更新了新的内核,grub文件也改为从新内核启动。
     
    四、把/work/linux-2.6.32拷贝到server端
    scp -r /work/linux-2.6.32 root@192.168.220.132:/srvwork
     
    五、给server端安装新内核
    cd /srvwork/linux-2.6.32
    make modules_install
    make install
    修改server的menu.lst,增加两个用新内核的启动项目。
    •    第一个启动项在原来的基础上添加了kgdb的参数:kgdboc=ttyS0,115200
    kgdboc 的意思是 kgdb over console,这里将kgdb连接的console设置为ttyS0,波特率为115200,
    如果不在内核启动项中配置该参数,可以在进入系统后执行命令: echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc   
    •    第二个启动项,增加参数:kgdboc=ttyS0,115200 kgdbwait参数,kgdbwait 使 kernel 在启动过程中等待 gdb 的连接。 
    重启server,选择第二个启动项,即kgdbwait项目。
    启动后,server端会停留在kgdb:waitting for connection from remote gdb
    说明server已经进入调试状态,等待gdb连接
     
    六、调试进入client系统并启动gdb:
    cd /work/linux-2.6.32
    gdb vmlinux
    (gdb) set remotebaud 115200
    (gdb) target remote /dev/ttyS0
    此时应该能出现:
    Remote debugging useing /dev/ttyS0
    kgdb_breakpoint() at kernel/kgdb.c 1721
    1721 wmb()
     
    类似这样的内容说明连接已经成功。这时你可以像使用本地gdb一样设置断点(break),单步执行(step),或其它命令.
     
    (gdb) continue
    执行continue,Server就继续下面的系统初始化了. 
     
    系统启动完成后,就可以进行内核的调试了,在server的终端输入:
      echo g > /proc/sysrq-trigger
    然后系统会中断,进入调试状态,等待远端gdb的连接。
    Server进入调试状态后,转换到client系统,重复上面对client的步骤就可以对内核进行调试了。
     
    七、我实践中遇到的问题
    SUSE11新内核启动失败,问题如下:
    Warning:module /lib/modules/2.6.32/kernel/drivers/hwmon/hwmon.ko is unsupported
    ……
    FATAL:module jdb not found
    FATAL:module ext3 not found
    FATAL:module /lib/modules/2.6.32/kernel/drivers/firmware/edd.ko is unsupported
    最后发现是因为在make 之后多用了一次make modules。其实make本身已经包含了make bzImage/make modules;
    经验1:通过修改Makeflie设定自己的内核版本,在make install的时候就会保留原来的内核版本
    经验2:先把client的内核编译完毕,然后clone整个client,省去了scp需要的大量时间。
  • 相关阅读:
    [转]使用Composer管理PHP依赖关系
    Php环境下载(PHPNow)安装
    精美的 ( Android, iPhone, iPad ) 手机界面设计素材和线框图设计工具
    八款强大的jQuery图片滑块动画插件
    JavaScript prototype.js提升JavaScript开发效率
    JS Message 网页消息提醒
    Vis.js图表插件
    动态算法学习
    GPS功能:百度路书自定义【轨迹回放】
    CSS美化页面滚动条
  • 原文地址:https://www.cnblogs.com/mingziday/p/2304070.html
Copyright © 2020-2023  润新知