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,内核正常启动,搞定大笑

  • 1
  • 2
  • 下一页

相关内容