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]