我用的是网上说的kgdb + VMware,只能调试加载了kgdb模块之后的代码。为了调试引导过程,我用bochs也
安装了一个linux(相当慢)。
下面就说下如何使用gdb和VMware调试内核
一,准备
1)开发机:装有Linux的PC
2) 从www.kernel.org下载内核源代码,如2.6.28。
3) 从soft.nankai.edu.cn上下载VMware 的Linux版本和补丁,安装
二,配置VMware
1) 新建一个虚拟机,增加一个串口,让串口指向命名管道/tmp/com_1
2) 虚拟机安装Linux的一个发布版,推荐Fedora,因为我用ubuntu没有成功,^_^。
3) 安装Fedora时不需要安装桌面,但开发库和开发工具要安装,如果你想在虚拟机上编
译内核
三,创建配置文件
1) 复制虚拟机Linux的配置文件到要调试内核的源代码目录
2)修改配置文件,(我用的是make menuconfig)
1,进入Kernel Hacking
2, 选中Magic Sysrq Key
3, 选中Compile the kernel with debug info
4,选中KGDB: kernel debugging with remote gdb
四,使用修改后的配置文件编译内核,并在虚拟机上安装编译好的内核。简单来说,就是:
1) make
2) make modules_install
3) make install
请参考<Linux Kernel in a Nutshell>
五,配置目标机(虚拟机)
1) 编辑/etc/sysctl.conf, 设置kernel.sysrq=1
2) 修改/boot/grub/grub.conf,为新安装的内核增加引导参数。比如我的是:
kernel /vmlinuz-2.6.28 ro root=/dev/XXX kgdboc=ttyS0,115200 kgdbwait
关键是kgdboc后面的。这种设置会使内核在加载kgdb模块后,立即等待远程gdb接入,
如果想在用户登录以后再调试,就不需要这种设置。
六,如果内核是在虚拟机上编译的,那么将编译后的vmlinuz和System.map下载到开发机
内核代码目录
七,重启虚拟机,进入新安装的内核,如果要求gdb接入,则内核会自动挂起,并输出提
示信息:kgdb: Waiting for connection from remote gdb...
八,配置开发机(本机Linux)。VMware中串口指向的命名管道并不是真实的命名管道,
而是一个Unix-domain的socket,但是gdb不能使用这种socket,所以需要把它重定向到
gdb能够支持的设备:
$ socat -d -d /tmp/com_1 PTY,输出结果会告诉你定向到了哪个设备,如/dev/pts/2
九,开始调试
1) 进入内核代码目录
2) $gdb ./vmlinuz
3)$(gdb)set remotebaud 115200
4) $(gdb)target remote /dev/pts/2;当然也有可能不是2,根据实际情况而定
5) 如果成功,则会发现虚拟机的断点设在kernel/kgdb.c文件中
十,如果是想在用户登录以后调试,则可以通过以下方法触发kgdb
1)$echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc
2) $echo "g" > /proc/sysrq-trigger,再次触发
十一,参考资料
1) http://jaredrobinson.com/blog/?p=204
2) http://www.kernel.org/pub/linux/kernel/people/jwessel/kgdb/index.html
3) http://oslab.info/index.php/Misc/KGDB
(秩名) |