版本说明
内核自2.6.22版本开始内嵌KGDB支持; 2.6.16之前版本需要在网上找kgdb的补丁; 2.6.16和2.6.22之间的版本在网上找不到合用的补丁; 对于低于2.6.22版本的内核空间代码, 在实际调试时, 如果不是特别复杂, 建议花点时间先移植到2.6.22以上的版本上并调试通过, 然后再回到实际要求内核版本上进行调试.
2.6.22-2.6.32之间的版本试过好多种,redhat搭建kgdb后,输入echo g > /proc/sysrq-trigger不能正常中断程序,尚未找到原因;用centos5搭建成功;
2. 在vmware中新建一台centos-5-i386系统的虚拟机,命名为client,编译内核,然后VM->clone克隆一台, 命名为server;
make menuconfig : Kernel Hacking-->
Compile the kernel with frame pointers勾选
KGDB:kernel debugging with remote gdb勾选
Write protect kernel read-only data structures不勾选
make
make modules_install
make install
client机运行应用程序,要调试的内核模块放到server机上,client机控制server机上内核模块的运行,client机执行gdb vmlinux。
3.分别查看两台机器的串口 dmesg|grep tty
vmware上分别为两个机器添加一个串口,以"Output to named pipe"方式:
client端选择"this end is the client","the other end is a virtual machine"
server端选择"this end is the server","ther other end is a virtual machine"
两个pipe名称要相同,并且勾选Connet at power on和Advanced里面的Yield CPU on poll.
再次查看dmesg|grep tty 查看新增的串口名称,假设为ttyS0
测试 server控制台输入 cat /dev/ttyS0
client控制台输入 echo hello > /dev/ttyS0
server上如果能看到输入的hello,说明串口通讯正常。
4. 在/boot/grub/grub.conf kernel行末添加 kgdboc=ttyS0,115200
5. 内核模块调试
client端:
cd /root/iofilter
make
scp iofilter.ko root@targertip:/root/iofilter
server端:
cd /root/iofilter
insmod iofilter.ko
cat /sys/module/globalment/sections/.text
0xda234567
得到iofilter模块的.text段地址
echo g > /proc/sysrq-trigger
server系统进入等待状态
client端:
cd /usr/src/linux
gdb vmlinux
set remotebaud 115200
target remote /dev/ttyS0
add-symbol-file /root/iofilter/iofilter.ko 0xda234567
add-symbol-file 参数1是client上iofilter.ko文件的位置,参数2是得到的server端上iofilter.ko的.text段的地址
break func1
coutinue
server会运行
6. 看起来和两个windows系统间的远程调试原理差不多。