Linux kernel 使用GDB-vmlinux/proc/kcore读取内存

Linux kernel 使用GDB-vmlinux/proc/kcore读取内存,linux-kernel,gdb,kernel,elf,procfs,Linux Kernel,Gdb,Kernel,Elf,Procfs,我正在尝试使用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. [Ne

我正在尝试使用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\u DEBUG选项都设置为yes。然后我重新启动了系统。我的问题是:

  • 为了使对/boot/config-4.18.0-rc1+所做的更改生效,我还需要做些什么吗
  • 基于vmlinux-4.18.0-rc1+的文件类型,该文件是否可以用于调试

  • 我不是自己构建内核的。这是Raptor计算机系统的定制版本。

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

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

    • 咨询/proc/kallsyms(例如grep系统调用表/proc/kallsyms)。找到地址。注意,这可能显示为0x00000000-可以通过将/proc/sys/kernel/kptr_restrict设置为0来修复

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


    谢谢!我还有一些问题。首先,sys\u call\u表不出现在/proc/kallsyms中/proc/sys/kernel/kptr\u restrict已设置为0。第二,当我尝试使用x/20x之类的东西打印内存时,我得到以下结果:(gdb)x/20x 0xbbbb 0xbbbbbb:无法访问地址0xbbbb处的内存这是我从/proc/kallsyms尝试的任何地址的情况。这些问题的原因可能是什么?所以,sys_call_表可能不会导出,或者在PPC上的名称可能会有所不同(我处理过许多Linux上的体系结构,但从来没有)。至于没有被阅读的地址,我建议尝试一些,看看你能从中得到什么。有些地址可能未映射,或者是缓存地址(通常标记为“A”),因此无法在核心中访问。尝试以其他前缀开头的。如果没有导出sys\u call\u表,我是否需要重新构建内核才能正常工作?此外,我还尝试打印出大量随机地址,但没有一个有效。您可以从二进制文件中动态计算sys\u call\u表。也许我应该更清楚:“random”addresses=来自/proc/kallsyms的地址,而不仅仅是结果显示的任何地址,我可以使用/proc/kcore来查看虚拟内存。我一直在使用dd从中复制数据,例如,dd if=/proc/kcore of=filedump.txt bs=1024 skip=1024 count=1024。