【问题标题】:gdb can't resolve symbols for linux kernelgdb 无法解析 linux 内核的符号
【发布时间】:2019-03-11 14:28:33
【问题描述】:

我已经使用 VMware Workstation 设置了 Linux Kernel 调试环境。但是当我尝试连接正确连接的 gdb 但我无法设置任何断点或检查任何内核符号时。

目标机(被调试者)Ubuntu 18: 我已经使用以下指令编译了 linux 内核 5.0-0:

CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_REDUCED is not set
# CONFIG_DEBUG_INFO_SPLIT is not set
CONFIG_DEBUG_INFO_DWARF4=y
CONFIG_DEBUG_FS=y
# CONFIG_DEBUG_SECTION_MISMATCH is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set

还有我的 VMX 文件配置:

debugStub.listen.guest64 = "TRUE"
debugStub.listen.guest64.remote="TRUE"

之后,我将 vmlinux 转移到调试器机器并使用 gdb:

bash$ gdb vmlinux
gdb-peda$ target remote 10.251.31.28:8864
Remote debugging using 10.251.31.28:8864
Warning: not running or target is remote
0xffffffff9c623f36 in ?? ()
gdb-peda$ disas sys_open
No symbol "do_sys_open" in current context.

【问题讨论】:

    标签: linux linux-kernel gdb


    【解决方案1】:

    首先需要为对应的内核版本安装kernel-debug-devel、kernel-debuginfo、kernel-debuginfo-common。 然后你可以使用 crash 工具来调试内核,内核内部使用 gdb

    【讨论】:

      【解决方案2】:

      您要查找的符号名称有时并不完全符合您的预期。您可以使用 readelf 或其他类似工具在内核映像中查找符号的全名。由于各种架构级别的差异以及它们在内核代码中的相关标头和 C 定义,这些名称有时与代码中的名称不同。例如,您可以使用以下方法来反汇编 open() 系统调用:

      disas __x64_do_sys_open
      

      如果您已经为 x86-64 架构编译它。 另请注意,这些命名约定可能会在不同版本的内核中发生变化。

      【讨论】:

        猜你喜欢
        • 2017-07-20
        • 1970-01-01
        • 2022-08-18
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多