使用Windows主机在VMWare中调试Linux内核

时间:2010-01-24 23:18:45

标签: linux-kernel vmware

我正在研究我的第一个内核模块,所以我对此有点新......

我的模块偶尔会产生恐慌,我无法使用printk找到它的底部。据我所知,我的调试选项是:

1。)查找生成的OOPS消息并使用ksymoops

2。)尝试使用kgdb进行远程调试

我正在使用Windows主机并在VMWare中运行Ubuntu,这使得事情变得复杂。我想首先尝试OOPS消息,但我不知道如何捕获它。发生时我是否需要运行串行控制台?如果是这样,我怎么能用Windows主机做到这一点?我需要两个VM吗?

就像我说的那样,我对此(以及一般的Linux)有点新意,所以我真的可以使用一些指导。谢谢!

3 个答案:

答案 0 :(得分:3)

前一段时间我成功地使用了“alinrus”技术。他提到的部分详细解释如下: http://stackframe.blogspot.com/2007/04/debugging-linux-kernels-with.html

我实际上直接从Windows主机使用它。因此,在设置VM(主要启用远程调试和下载内核(vmlinux文件, vmlinuz文件,无法由gdb解释))之后,您需要执行以下操作:

  1. 在Windows机器上安装最近的gdb(我使用了Cygwin中的那个)。
  2. 使用vmlinux文件启动gdb,然后执行“target remote localhost:8832”以连接VM(当它运行时)。
  3. 这是调试静态链接到内核的代码所需要的。您可以尝试静态链接您的模块,上面就足够了。为动态链接模块设置调试需要一个额外的步骤来通知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)