ubuntu + virtual box + centos + kgdb串口 调试内核

OS版本与职责分工

Ubuntu作为Dev Machine, 版本,内核版本

CentOS作为Target Machine (即被调试的系统), 版本, 内核版本

第1步:Target Machine 重新编译内核

1. make menuconfig

2. 打开内核调试信息.在Kernel hacking里选中"Kernel debugging",并且

    a.打开"Compile the kernel with debug info"

    b.打开"Compile the kernel with frame pointers"

    c.关闭"Write protect kernel read-only data structures",否则无法设置断点

3. 打开KGDB相关选项. 在Kernel hacking

    a.打开“KGDB: kernel debugging with remote gdb”

    b.然后再进去打开"KGDB: use kgdb over the serial console", 表示用串口来连接Dev Machine和Target Machine

4. 编译内核并安装,然后重启Target Machine

第2步:把Target Machine上的vmlinux文件共享给Dev Machine

Dev Machine上需要vmlinux作为符号表和gdb的入口。 你可以把Target Machine上的文件直接scp到Dev Machine .

如果需要在Dev Machine上调试源码,那最好把Target Machine上的整个内核源码目录复制过来,而不仅仅是vmlinux文件

第3步:为Target Machine配置串口并映射到Dev Machine

1. 在virual box中配置串口(要先关闭Target Machine)

见图



   这里把Target Machine的串口映射到Dev Machine中的某个文件

2. 再把这个文件映射为Dev Machine中的某个虚拟终端(PTY),因为Dev Machine的GDB在远程调试时需要给出虚拟终端. 这里可以用socat这个工具. 在Dev Machine上执行:

    sudo apt-get install socat

    socat -d -d /home/kent/diskD/VirtualBox/centos/serial PTY:

    观察一下输出,你会看到PTY is /dev/pts/xxx之类的字样。 在我机上是 /dev/pts/10

   

第4步:使用SysRq和GDB进行远程调试

1. 在Target Machine中把串口设置为kgdb通道。以root身份执行:echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc  (也可以把kgdboc=ttyS0,115200作为kernel的启动参数,这样Target Machine启动时会自动在串口上激活debugger)

2. 使Target Machine进入debug状态: echo g > /proc/sysrq-trigger

3. 在Dev Machine上使用gdb:

    gdb vmlinux

    (gdb) target remote /dev/pts/10

4. 这就连上了。 可以试一下cont, list等命令   

补充说明:

    1.如果需要在boot阶段就调试,则需要使用kgdbwait参数。可以Google一下。

参考资料:

   
http://kernel.org/doc/htmldocs/kgdb.html

    [url]http://www.linuxforu.com/2011/03/kgdb-with-virtualbox-debug-live-kernel/ [/url]

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.