1. 版本说明

    内核自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系统间的远程调试原理差不多。