不久前我成功地使用了“alinrus”所指的技术。他提到的部分详细解释在:http://stackframe.blogspot.com/2007/04/debugging-linux-kernels-with.html
我实际上是直接从 Windows 主机上使用它的。所以设置好VM后(主要是启用远程调试和下载内核(vmlinux文件,notgdb 无法解释的 vmlinuz 文件)),您需要执行以下操作:
- 在 Windows 机器上安装最新的 gdb(我在 Cygwin 中使用过)。
- 使用 vmlinux 文件启动 gdb,然后执行“target remote localhost:8832”来连接虚拟机(当虚拟机运行时)。
这就是调试静态链接到内核的代码所需的。您可以尝试静态链接您的模块,上面的内容就足够了。为动态链接模块设置调试需要额外的步骤来通知 gdb 使用模块文件,以及如何解释文件的部分。
3a.加载模块后(在模块崩溃之前:)),在 .ko 文件上运行下面的脚本。
3b.将生成的“add-symbol-file mymodule.ko 0xe8884000 ...”行粘贴到 gdb 中。然后,gdb 将加载您的模块,只要它可以在当前目录或您指定的路径中找到它。
脚本来自http://anomit.com/2009/11/04/kernel-module-debugging-a-simple-technique/
#!/bin/sh
#
# gdbline module image
#
# Outputs an add-symbol-file line suitable for pasting into gdb to examine
# a loaded module.
#
cd /sys/module/$1/sections
PROG=${1}.ko
echo -n add-symbol-file ${PROG} `/bin/cat .text`
#echo -n add-symbol-file $2 `/bin/cat .text` #Take second argument to be gdb name of program/object file
for section in .[a-z]* *; do
if [ $section != ".text" ]; then
echo " \\"
echo -n " -s" $section `/bin/cat $section`
fi
done
echo
您可能还有更多想做的事情。要进行实际的源代码级调试,您需要获取所有内核和模块源代码,以便 gdb 可以找到它。一旦你做到了这一点,你可以使用一些技巧来编译你的模块而无需优化。
您可能还想查看 Workstation 7.0 关于重播调试的技术说明,其中包含有关调试内核模块的信息。 VMware 了解他们的东西。http://www.vmware.com/pdf/ws7_replay_linux_technote.pdf