感谢支持
我们一直在努力

VMware环境下的kgdb环境配置和模块调试示例

linux下的模块开发,不可避免要用到kgdb来调试,kgdb的调试环境需要一台开发机,一台目标机,其中代码运行在目标机上,开发机通过串口来调试目标机上的模块代码。用vmware可以方便的使用管道来代替真正的串口,而且只用一台笔记本就可以玩起来,非常简单粗暴 得意


1. 开发机和目标机通过vmware的命名管道建立串口设备,其中开发机作为管道的client,目标机作为管道的server,如图所示


开发机串口设置





目标机串口设置




之后就可以安装虚机了,我选用的是CentOS6的发行版本,自带RedHat裁剪过的2.6.32的内核,之所以选这个版本的内核,因为2.6.28之后的内核版本已经合并了kgdb(之前的mainstream内核版本是没有kgdb模块的,需要自己下载一份patch,麻烦。。)安装完成后,建议你重新编译一次kernel,我选的是2.6.32.27的kernel.org版本,在make menuconfig时,记得把kernel hacking里面该选的都选上,特别是kgdb下面的选项都编进内核(具体的.config可以问我要)





All these options on are the “Kernel Hacking” menu.


In order to support KDB, “KGDB” support must be turned on first (even if you aren’t using kgdb/gdb)



  • CONFIG_DEBUG_KERNEL=Y – includes debug information in the kernel compilation – required for basic kernel debugging support
  • CONFIG_KGDB=Y – turn on basic kernel debug agent support
  • CONFIG_KGDB_SERIAL_CONSOLE=Y – to share a serial console with kgdb.

    • Sysrq-g must be used to break in initially.
    • Selecting this will automatically set:

      • CONFIG_CONSOLE_POLL=N
      • CONFIG_MAGIC_SYSRQ=Y – turn on MAGIC-SYSRQ key support

  • CONFIG_KGDB_KDB=Y – actually turn on the KDB debugger feature

Optional other configuration settings:



  • CONFIG_FRAME_POINTER=Y – this allows for better backtrace support in KDB
  • CONFIG_DEBUG_RODATA=N – disable this in order to support breakpoints on data accesses
  • CONFIG_KALLSYMS=Y – this adds symbolic information to the kernel, useful to see symbols instead of addresses
  • CONFIG_KDB_KEYBOARD – use KDB with an attached keyboard (not for use with serial console)
  • CONFIG_KGDB_TESTS – used to turn on kgdb internal self-tests – see the config help for this for more information


注意CONFIG_DEBUG_RODATA不要选上

开发机虚机安装完之后,最简单的就是copy一份成为目标机,OK现在万事俱备了


有两种方式开始调试,如果你不想kernel在load完之后就hold住,可以在进入shell之后开始搞事。首先在开发机和目标机都是设置下stty参数,这样串口才可以通信


开发机:stty ispeed 115200 ospeed 115200 -F /dev/ttyS0


目标机:stty ispeed 115200 ospeed 115200 -F /dev/ttyS0


完了之后可以测试下,目标机上cat /dev/ttyS0,然后开发机上echo “test” > /dev/ttyS0,这时候目标机上应该显示test出来


在目标机上敲  echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc 如果成功,可以在/var/log/message里看到 kernel: kgdb: Registered I/O driver kgdboc


好了,现在你可以load你的module了(具体如何调试module下一篇文章讲),如果想要开始设置断点,首先需要 echo g > /proc/sysrq-trigger,这时会显示:


SysRq: DEBUG


Entering KGDB


表示目标机已经开始等待开发机的kgdb连接了


在开发机上,首先用gdb装载内核,这里要装载带有debug symbol的内核,就是为什么要编译一份内核的原因了,我这里是


gdb /usr/src/kernels/linux-2.6.32.27/vmlinux


(gdb) set remotebaud 115200


(gdb) target remote /dev/ttyS0




如果能看到这个,说明基本成功了,恭喜你!




现在目标机的内核已经break在 wmb()上了,如果你要目标机继续工作,可以c 一下,做一些事情,然后在目标机上再次敲 echo g > /proc/sysrq-trigger,又会回来




如果想让kernel在启动时就hold住等待调试的话,可以修改grub参数,如下图所示




这样目标机内核启动时会打出一条:


kgdb: Waiting for connection from remote gdb


这时用开发机的gdb去连就OK了,按个c,内核正常启动,搞定大笑

这一篇用一个简单的例子来说明调试kernel module的过程,例子是ldd3书上的hellp模块


首先需要在目标机上编出hellop.ko出来,然后把 hello.ko 和 hellop.c 拷贝到开发机上。OK,下面在目标机上 insmod hellop.ko whom=”dude” howmany=5


这时候可以 echo g > /proc/sysrq-trigger,从而挂起kernel,等待开发机的kgdb从串口进来


在开发机上开启 gdb vmlinux,然后set remotebaud 115200, target remote /dev/ttyS0,这时候可以看到kernel的挂机点,一般都是那个wmb()


忘了说,目标机上insmod 完 hellop.ko之后,要去查看/sys/module/hellop/sections里面的 .text  .data  .bss 等地址,这些地址都是 0x 开头的32bit 或者 64bit 的16进制数。 然后在开发机的gdb里,敲


(gdb) add-symbol-file hellop.ko  $TEXT_SEGMENT_ADDR -s .data $DATA_SEGMENT_ADDR  -s .bss $BSS_SEGMENT_ADDR,这样gdb就可以基于这些地址找到模块的symbol了


举例来说,下面我们break到 hello_exit里面


(gdb) b hello_exit


然后 continue 下去




这时,在目标机上 rmmod hellop,可以发现开发机的gdb 进入了hello_exit 里面,我们可以用各种gdb命令来查看,如下图所示


赞(0) 打赏
转载请注明出处:服务器评测 » VMware环境下的kgdb环境配置和模块调试示例
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏