参考博文:
http://blog.chinaunix.net/space.php?uid=20937170&do=blog&id=3035576
http://hi.baidu.com/lijunzzu/blog/item/da92bb037b9c826c3912bb4b.html
http://blog.csdn.net/jie12310/article/details/4564853
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可以问我要),或者下面的步骤不用配置,直接下载2.6.37.71以后的src.rpm的内核源码包直接rpmbuild -bc 编译源码包,一直到最后编译结束有个vmlinux文件即可
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)
Optional other configuration settings:
开发机虚机安装完之后,最简单的就是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,内核正常启动,搞定