首页 > 解决方案 > 使用 GDB vmlinux /proc/kcore 读取内存

问题描述

我正在尝试使用 gdb 从 vmlinux 读取内存。确切的语法是

sudo gdb vmlinux-4.18.0-rc1+ /proc/kcore

我使用这个文件是因为 vmlinux 是这个文件的符号链接。结果如下

Reading symbols from vmlinux-4.18.0-rc1+...(no debugging symbols found)...done.

warning: core file may not match specified executable file.
[New process 1]
Core was generated by `root=/dev/mapper/rcs--power9--talos--vg-root ro console=hvc0 quiet'.
#0  0x0000000000000000 in ?? ()
(gdb) x/4xb 0xfffffff0
0xfffffff0:     Cannot access memory at address 0xfffffff0
(gdb) print &sys_call_table
No symbol table is loaded.  Use the "file" command.
(gdb)

文件 vmlinux-4.18.0-rc1+ 位于 /boot。文件类型如下:

root@rcs-power9-talos:/boot# 文件 vmlinux-4.18.0-rc1+ vmlinux-4.18.0-rc1+:ELF 64 位 LSB 可执行文件,64 位 PowerPC 或 cisco 7500,版本 1 (SYSV),静态链接, BuildID[sha1]=a1c9f3fe22ff5cbf419787657c878c8a07e559b2, 剥离

我修改了 config-4.18.0-rc1+ 文件,使得每个 CONFIG_DEBUG 选项都设置为 yes。然后我重新启动了系统。我的问题是:

  1. 我是否需要做其他任何事情才能使我对 /boot/config-4.18.0-rc1+ 所做的更改生效?
  2. 根据 vmlinux-4.18.0-rc1+ 的文件类型,这个文件是否应该可以用于调试?

我没有自己构建内核。它是 Raptor Computer Systems 的定制版本。

标签: linux-kernelgdbkernelelfprocfs

解决方案


您修改的 config-* 文件仅供参考 - 所有这些选项都已编译到内核中,因此更改它们不会有任何效果。

但是,您可以通过两个步骤获得所需的任何符号:

  • 查阅 /proc/kallsyms(例如 grep sys_call_table /proc/kallsyms)。获取地址。请注意,这可能显示为 0x00000000 - 可以通过将 /proc/sys/kernel/kptr_restrict 设置为 0 来修复

  • 然后使用上面的地址作为直接参数。您仍然会遇到一些小问题(例如,“打印”不知道它是什么数据类型,但 x/20x 可以工作),但这些可以通过一些 gdb 脚本或提供外部 dwarf 文件来解决。


推荐阅读