gdb无法解析Linux内核的符号

时间:2019-03-11 14:28:34

标签: linux linux-kernel gdb

我已经使用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.

2 个答案:

答案 0 :(得分:0)

首先,您需要为相应的内核版本安装kernel-debug-devel,kernel-debuginfo,kernel-debuginfo-common。 然后,您可以使用崩溃实用程序调试内核,该内核在内部使用gdb

答案 1 :(得分:0)

您正在寻找的符号名称有时与您期望的名称不完全相同。您可以使用readelf或其他类似工具在内核映像中查找符号的全名。这些名称有时会与代码中的名称不同,这是因为各种体系结构级别的差异以及它们在内核代码中的相关头和C定义。例如,您可以使用以下方法来分解open()系统调用:

disas __x64_do_sys_open

如果已针对x86-64体系结构对其进行了编译。 另外请记住,这些命名约定可能会在不同版本的内核中发生变化。