【问题标题】:Enable debugging of kernel module from user-space process从用户空间进程启用内核模块调试
【发布时间】:2015-02-28 04:38:12
【问题描述】:

我正在 ubuntu 14.04 服务器上使用 openvswitch。我可以轻松地附加 gdb 及其任何二进制文件以调试其各种功能,但是当涉及到其内核模块时,我无法根据我的要求对其进行调试。 我正在使用以下步骤将 linux 内核与 gdb 连接: 1.gdb /tmp/vmlinux /proc/kcore 2. 向 GDB 添加符号文件: cd /sys/module/openvswitch/sections/ ls -A1 .cat .text .data .bss 3. 在 gdb - 添加符号文件 datapath/linux/openvswitch.ko 0xf87a2000 -s .data 0xf87b4000 -s .bss 0xf87b4560 4. b vxlan_udp_encap_recv

但是当我生成用于测试 ovs 内核模块的数据包并跳过它时,它会显示“程序没有运行。”

注意:我已经通过运行以下命令确认了所有模块符号:nm root/ovs/_build-gcc/datapath/linux/openvswitch.ko = 打印所有符号。并且 lsmod 也确认了 ovs 内核模块的存在。

我想让 ovs 模块在它从 netlink 套接字上的用户空间应用程序接收到消息后在指定的断点处停止,以便进行详细调试,因为它允许我调试用户空间进程。请建议我如何解决此问题或是否有任何替代方法。对于任何帮助或建议,我将不胜感激。谢谢!

【问题讨论】:

  • 想象一下,如果你可以在内核中设置一个断点,在同一台机器上使用调试器......然后 gdb 会在断点被命中时暂停内核,然后你的机器将完全冻结,因为内核已暂停...
  • 这个线程的任何解决方案?我遇到了同样的问题。谢谢!

标签: c linux-kernel gdb


【解决方案1】:

要调试内核,您需要使用KGDB / KDB

【讨论】:

  • 我不需要调试整个内核,我只想调试内核中特定模块的行为。
  • @Viciouss:是一样的,因为内核模块只是一个在内核中加载和执行的代码库。
【解决方案2】:

一种可能性:

在目标机器上运行 gdb 服务器。在另一台机器上运行 gdb。使用 gcc 上的 -ggdb 参数重新编译目标机器内核。使用所有 -ggdb 信息运行内核的目标机器启动两台机器。在两台机器上都有所有可用的源。从测试机器连接到目标机器。让 gdb 服务器连接到内核 ....

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 2010-10-21
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2012-12-26
    • 2014-03-07
    相关资源
    最近更新 更多