【问题标题】:Why are there no debug symbols in my vmlinux when using gdb with /proc/kcore?使用带有 /proc/kcore 的 gdb 时,为什么我的 vmlinux 中没有调试符号?
【发布时间】:2023-05-15 20:36:01
【问题描述】:

我已将所有与CONFIG_DEBUG_ 相关的选项配置为y,但是当我尝试调试内核时,它说没有找到调试符号:

gdb /usr/src/linux-2.6.32.9/vmlinux /proc/kcore

Reading symbols from /usr/src/linux-2.6.32.9/vmlinux...(no debugging symbols found)...done.

为什么?

【问题讨论】:

  • 您能否验证您的.config 文件确实包含CONFIG_DEBUG_INFO=y 行?
  • 是的,我已经验证过很多次了。
  • 您是否正在编译自己的内核,调试发行版打包的内核?
  • 是的,我正在编译自己的内核,但目前还没有调试符号...
  • 在GDB中,(gdb) b fs/open.c:10的输出是什么?

标签: gdb linux-kernel


【解决方案1】:

这是我目前为止最好的猜测:我不知道,也没关系。

我不知道为什么 GDB 会打印消息“(未找到调试符号)”。在构建自己的内核时,我实际上已经看到了这一点。我将内核配置为使用调试符号,但 GDB 在查看内核映像时仍会打印此消息。我从不费心去研究它,因为我的图像仍然可以很好地调试。尽管有消息,GDB 仍然可以反汇编函数、添加断点、查找符号和单步执行函数。我从来没有注意到缺少调试功能。我猜同样的事情也发生在你身上。

编辑:根据您对问题的 cmets,您似乎在使用调试器搜索错误的符号。系统调用处理程序以 sys_ 前缀开头,但您无法通过查看代码来判断。宏 SYSCALL_DEFINE4(ptrace, ...) 最终将函数声明为 asmlinkage long sys_ptrace(...),尽管如果您启用了 ftrace,它还会做一些其他疯狂的事情。

【讨论】:

    【解决方案2】:

    make menuconfig->kernel hacking->[]内核调试->[]用调试信息编译内核(CONFIG_DEBUG_INFO)

    【讨论】:

    • OP不是说他已经这样做了吗? "我已将所有 CONFIG_DEBUG_ 相关选项配置为 y"
    【解决方案3】:

    在内核 Makefile 中的 CFLAGS 变量中添加 -g

    【讨论】:

      【解决方案4】:

      也有可能在打包 vmlinuz 映像时,调试符号被剥离(当使用 make-kpkg 为 linux 内核构建 deb 包时)。所以你必须使用你的 linux 源代码树下构建的 vmlinux 文件来获得这些调试符号。

      【讨论】:

        【解决方案5】:

        我可能错了,但我认为您必须为内核安装 debuginfo 包才能获取符号

        【讨论】:

        • 不,我想我已经安装了这个包:CONFIG_DEBUG_INFO=y