2010-01-24 36 views
4

我我第一次内核模块上工作,所以我在这个有点新...调试Linux内核在VMWare与Windows主机

我的模块有时会产生恐慌,我不能去了它的底部使用printk。至于我可以告诉我的选择调试是:

1)找到生成的Oops消息和使用ksymoops的

2)在远程调试使用的kgdb

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

就像我说的,我对这个(和Linux一般)有点新,所以我可以真正使用一些指导。谢谢!

回答

3

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

我实际上直接从Windows主机使用它。因此,在设置VM后(主要是启用远程调试和下载内核(在vmlinux的文件,不能用GDB)解释将vmlinuz文件),你需要做到以下几点:

  1. 安装最近在你的Windows机器上使用了gdb(我使用了Cygwin中的gdb)。
  2. 使用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

1

我不知道这是否会帮助你Winblowz,但如果你可以将你的虚拟机到Linux框:

Debugging Linux kernels with Workstation 6.0

我们只是静静地添加一个令人兴奋的 功能到Workstation 6.0。我相信 它将使WS6成为Linux内核开发的绝佳工具。您现在可以在您的主机上使用gdb来调试运行在虚拟机内的Linux内核,即 。没有 kdb,不需要重新编译,也不需要 第二台机器。所有你需要的是一个 单行虚拟机的配置 文件。

我认为这也可能适用于其他最近的VMware产品。

因为它在Mac OSX以及我怀疑它会在Winblowz工作也:

Debugging linux kernel (inside vmware) from Mac OSX

由于这个线程建议,你也可能在远离虚拟机上运行的第二个Linux调试一台Linux VM同一台机器。