【问题标题】:Reading memory with GDB vmlinux /proc/kcore使用 GDB vmlinux /proc/kcore 读取内存
【发布时间】:2020-09-25 00:35:19
【问题描述】:

我正在尝试使用 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-kernel gdb kernel elf procfs


    【解决方案1】:

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

    但是,您可以通过两步获得任何您想要的符号:

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

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

    【讨论】:

    • 谢谢!我还有一些问题。首先,sys_call_table 没有出现在 /proc/kallsyms 中。 /proc/sys/kernel/kptr_restrict 已设置为 0。其次,当我尝试使用 x/20x 之类的东西打印内存时,我得到以下信息: (gdb) x/20x 0xbbbb 0xbbbb: Cannot access memory at address 0xbbbb This我从 /proc/kallsyms 尝试的任何地址都是这种情况。什么可能导致这些问题?
    • so , sys_call_table 可能不会被导出,或者在 PPC 上以不同的方式命名(我已经处理了许多 Linux 上的架构,但从来没有这样)。至于没有被读取的地址,我建议尝试一些,看看你在哪里。一些地址可能没有被映射,或者是缓存地址(通常标记为“A”),因此无法在核心中访问。尝试以其他前缀开头的。
    • 如果没有导出 sys_call_table,我是否需要重建内核才能使其正常工作?我还尝试打印出大量随机地址,但它们似乎都不起作用。
    • 您可以从二进制文件中动态找出 sys_call_table。也许我应该更清楚:“随机”地址 = /proc/kallsyms 中的地址,而不仅仅是任何
    • 事实证明,我可以使用 /proc/kcore 查看虚拟内存。我一直在使用 dd 从中复制数据,例如。 dd if=/proc/kcore of=filedump.txt bs=1024 skip=1024 count=1024.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2021-01-03
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多