虚拟内存和核心转储之间的关系

relationship between virtual memory and core dump

我有一个可执行文件和一个 gcore。

我用 gcore 创建了核心转储文件。

现在,我想将可执行文件的虚拟地址映射到核心转储。

我知道核心转储是一个可执行文件的内存转储,如果我想从核心转储中分析虚拟地址。我可以假设虚拟地址 0x0000 等于核心转储的偏移量 0x0000 吗?

I know that the core dump is a memory dump of an executable file,

没有。 gdb 中的核心转储(gcore 表示您正在使用它)通常采用 ELF 格式,因此有一个广泛的 header 定义什么映射到什么。

我不太确定在转储内核时 GDB/linux 对地址 space 进行了多少使用,但是您不能假设文件偏移量 x 将映射到内存偏移量 x —— 因为虚拟地址 space 可以跨越 巨大的 地址 space,它只使用其中的几页。 (例如,一个 64 位进程可以有一个比你的硬盘驱动器大得多的虚拟地址 space,而它可能只有实际保留的内存要小得多,即使如此,实际上并不是所有的页面都需要分配) .

然而,GDB 可以读取这些 headers,如果你要求它打印东西(例如使用 printx 命令),它会给你正确的东西.

如果你想读取核心转储文件,正确的做法是使用 GDB 的功能来这样做。幸运的是,有 libgdb,它完全适合您的 C/C++ 应用程序。它基本上让您与 GDB 交谈,就好像您是坐在 gdb 前面的用户一样 shell。因此,弄清楚如何在 GDB 中执行您想要的操作,然后使用 libgdb 以编程方式执行此操作。

如果你想做低级的(不要那样做,很麻烦,实际上 GDB 确实是你想要使用的)你可以直接使用 Binary File Descriptor Library 来解析和表示核心转储。它是 GDB 的重要组成部分,如果没有 re-implementing 大量 GDB 例程,很难用您自己的 C++ 程序将其实现 运行。