参考http://blog.csdn.net/zr_lang/article/details/8107015
环境需求:
两台linux虚拟机,我这里用的virtualbox安装的ubuntu12.04系统,内核版本3.2
其中1台虚拟机作为开发机virtualpc,另一台则作为被调试机target
过程:
由于不会对下载来的内核源码进行准确的编译配置,一般下载的源码编译安装后无法引导,提示缺少相关模块,这就是由于模块配置的原因无法进入新装内核系统,而不同版本之间的配置文件又无法通用
不过在查看原系统配置文件的时候发现这个直接安装的系统居然已经配置了所需的KGDB选项(虽然不知道一般的发行版为什么会默认配置这个.....)
这样就好办了根本不需要重新编译安装新内核,只要在当前可用内核中添加kgdb启动参数就能等待调试了,于是在target中sudo apt-get install linux-image-3.2.0-51-generic-pae,在grub.cfg中copy出一个新的3.2.51内核的启动项,然后在启动参数后添加kgdboc=ttyS0,115200 kgdbwait。
然后在www.kernel.org下载了3.2.0-51版本的内核,make bzImage后获得调试需要的vmlinux内核文件。
同时设置启用两台虚拟机的串口COM1,端口模式为主机管道,输入相同的管道文件路径,并在virtualpc中勾选创建通道。
首先启动virtualpc开发机,将下载编译了的内核源代码复制或共享到开发机中,启动target调试机选择新的kgdb调试选单,会出现等待远程调试连接的提示,这时候就能使用我们的gdb来调试内核了,gdb的简单UI版gdbtui或者cgdb也可以使用,调试起来更加直观。这里使用了cgdb,首先:
cd到源码根目录
cgdb vmlinux
set remotebaud 115200
target remote /dev/ttyS0
之后就会出现内核源码并能够开始真正的调试工作,同时可以观察target的变化。
经测试上面链接中的用主机gdb在set remotebaud 115200后用target remote | socat stdio unix-connect:/tmp/vbox来连接管道调试虚拟机可行。看来主机调试虚拟机是完全没问题地!~
贴上调试效果: