我正在研究我的第一个内核模块,所以我对此有点新......
我的模块偶尔会产生恐慌,我无法使用printk找到它的底部。据我所知,我的调试选项是:
1。)查找生成的OOPS消息并使用ksymoops
或
2。)尝试使用kgdb进行远程调试
我正在使用Windows主机并在VMWare中运行Ubuntu,这使得事情变得复杂。我想首先尝试OOPS消息,但我不知道如何捕获它。发生时我是否需要运行串行控制台?如果是这样,我怎么能用Windows主机做到这一点?我需要两个VM吗?
就像我说的那样,我对此(以及一般的Linux)有点新意,所以我真的可以使用一些指导。谢谢!
答案 0 :(得分:3)
我实际上直接从Windows主机使用它。因此,在设置VM(主要启用远程调试和下载内核(vmlinux文件,不 vmlinuz文件,无法由gdb解释))之后,您需要执行以下操作:
这是调试静态链接到内核的代码所需要的。您可以尝试静态链接您的模块,上面就足够了。为动态链接模块设置调试需要一个额外的步骤来通知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
答案 1 :(得分:1)
我不确定这是否会对Winblowz有所帮助,但是如果你可以将你的VM移动到linux盒子:
Debugging Linux kernels with Workstation 6.0
我们只是悄悄地添加了令人兴奋的 功能到Workstation 6.0。我相信 它将使WS6成为一个很好的工具 Linux内核开发。你现在可以 在主机上使用gdb来调试 Linux内核在VM内部运行。没有 kdb,没有重新编译,也没有必要 第二台机器。你需要的只是一个 VM配置中的单行 文件。
我认为这可能也适用于其他近期的VMware产品。
因为它适用于Mac OSX,我怀疑它也适用于Winblowz:
Debugging linux kernel (inside vmware) from Mac OSX
正如该线程所暗示的那样,您也可以从运行在同一台机器上的第二个Linux VM远程调试一个Linux VM。
答案 2 :(得分:0)
看看这是否有帮助。我不使用Windows或VMWare http://communities.vmware.com/thread/236251;jsessionid=A4A69CC15C7B951C576EF254604655D8?tstart=0