我想打印并分析系统堆的内容。显然,这应该是一个特权操作,并且可能违背 GDB 的初衷。
具体来说,我想扫描整个系统堆,而不仅仅是堆的进程部分。
gdb 可以做到这一点吗?如果可以的话,什么命令可以做到这一点?如果没有,有没有工具可以做到这一点?
如果有必要,我愿意设置自定义驱动程序/调试内核/断点来完成此任务。
答案1
首先您需要了解以下基础知识虚拟内存。您不需要了解 MMU 的工作原理,但您确实需要了解什么是虚拟地址空间,以及何时处理虚拟地址或物理地址。否则你将无法理解你所看到的一切。
在Linux下,您可以通过以下方式访问系统的物理内存/dev/mem
: 字节氮of/dev/mem
是字节氮在 RAM 或内存映射外设中。除非您已经知道要寻找什么以及在哪里寻找,否则您将很难在那里找到有趣的东西。该文件/proc/iomem
描述了物理地址空间(RAM 和外设)中映射的内容。
您可以通过 : 访问内核的虚拟内存,/dev/kmem
这使您可以访问内核代码和数据结构,以及当前映射到内核中的设备,但不能访问进程内存。 Linux 也有/proc/kcore
,它与 类似,/dev/kmem
但在开头放置了一个 ELF 头,以方便在内核上运行调试器。调试器可以打开/proc/kcore
并处理它,就像处理进程的内存一样。您可以通过运行来调试正在运行的内核gdb /path/to/vmlinux /proc/kcore
(有更方便的设施,特别是远程调试)。
您可以通过以下方式访问进程的虚拟内存/proc/$PID/mem
。该文件/proc/$PID/maps
总结了进程地址空间中映射的内容;/proc/$PID/smaps
更详细的内容。
不存在“系统堆”或“集中堆管理器”这样的东西。最接近的是整个系统内存和内存管理器(Linux 中全部约 100kLoC,不包括特定于体系结构的部分)。