gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:59:43 28 4
gpt4 key购买 nike

我正在开发我的第一个内核模块,所以我对此有点陌生......

我的模块偶尔会产生 panic ,我无法使用 printk 深入了解它。据我所知,我的调试选项是:

1.) 找到生成的 OOPS 消息并使用 ksymoops

或者

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

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

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

最佳答案

不久前,我成功地使用了“alinrus”所指的技术。他提到的部分在以下位置进行了详细解释:
http://stackframe.blogspot.com/2007/04/debugging-linux-kernels-with.html

我实际上是直接从 Windows 主机上使用它的。所以在设置好虚拟机之后(主要是开启远程调试和下载内核(vmlinux文件,而不是gdb不能解释的vmlinuz文件)),你需要做以下事情:

  • 在你的 Windows 机器上安装一个最近的 gdb(我在 Cygwin 中使用了那个)。
  • 使用 vmlinux 文件启动 gdb,然后执行“target remote localhost:8832”以连接 VM(当它正在运行时)。

  • 这就是调试静态链接到内核的代码所需要的。您可以尝试静态链接您的模块,上述内容就足够了。为动态链接的模块设置调试需要一个额外的步骤来通知 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 模块镜像
    #
    # 输出适合粘贴到 gdb 中检查的 add-symbol-file 行
    # 一个加载的模块。
    #
    cd/sys/module/$1/sections
    程序=${1}.ko
    echo -n 添加符号文件 ${PROG} `/bin/cat .text`
    #echo -n add-symbol-file $2 `/bin/cat .text` #取第二个参数为程序/目标文件的gdb名称

    对于 .[a-z]* * 中的部分;做
    如果 [ $section != ".text"];然后
    回声“\\”
    echo -n "-s"$section `/bin/cat $section`

    完毕
    回声

    你可能想做的事情还有很多。要进行实际的源代码级调试,您需要提取所有内核和模块源代码,以便 gdb 可以找到它。一旦你走到这一步,你可以使用一些技巧来编译你的模块而无需优化。

    您可能还想查看 Workstation 7.0 关于重放调试的技术说明,其中包含有关调试内核模块的信息。 VMware知道他们的东西。
    http://www.vmware.com/pdf/ws7_replay_linux_technote.pdf

    关于linux-kernel - 使用 Windows 主机在 VMWare 中调试 Linux 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2129344/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com