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

Joh*_*yle 5 c++ memory coredump virtual-address-space

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

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

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

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

Mar*_*ler 3

我知道核心转储是可执行文件的内存转储,

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

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

然而,GDB 可以读取这些标头,如果您要求它打印内容(例如使用printorx命令),它会给您正确的内容。

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

如果你想在底层做这件事(不要这样做,这很麻烦,实际上 GDB 正是你想要使用的),你可以直接使用二进制文件描述符库来解析和表示核心转储。它是 GDB 的重要组成部分,如果不重新实现大量 GDB 例程,就很难让它与您自己的 C++ 程序一起运行。