【发布时间】:2015-08-28 13:43:24
【问题描述】:
我有一个可执行文件和一个 gcore。
我用 gcore 创建了核心转储文件。
现在,我想将可执行文件的虚拟地址映射到核心转储。
我知道核心转储是可执行文件的内存转储,如果我想从核心转储中分析虚拟地址。我可以假设虚拟地址0x0000 等于核心转储的偏移量0x0000?
【问题讨论】:
标签: c++ memory coredump virtual-address-space
我有一个可执行文件和一个 gcore。
我用 gcore 创建了核心转储文件。
现在,我想将可执行文件的虚拟地址映射到核心转储。
我知道核心转储是可执行文件的内存转储,如果我想从核心转储中分析虚拟地址。我可以假设虚拟地址0x0000 等于核心转储的偏移量0x0000?
【问题讨论】:
标签: c++ memory coredump virtual-address-space
我知道核心转储是一个可执行文件的内存转储,
没有。 gdb 中的核心转储(gcore 表示您正在使用它)通常采用 ELF 格式,因此有一个扩展的标头定义什么映射到什么。
我不太确定 GDB/linux 在转储内核时对地址空间修改有多少使用,但你不能假设文件偏移量 x 将映射到内存偏移量 x——因为虚拟地址空间可以跨越一个 巨大的地址空间,其中它只使用了几页。 (例如,一个 64 位进程的虚拟地址空间可能比您的硬盘驱动器大得多,而它实际上可能只有小得多的保留内存,即使这样,也不是所有页面都需要实际分配)。
但是,GDB 可以读取这些标头,如果您要求它打印内容(例如,使用 print 或 x 命令),它会为您提供正确的内容。
如果您想读取核心转储文件,那么正确的做法是使用 GDB 的功能来执行此操作。幸运的是,有 libgdb,它对您的 C/C++ 应用程序完全适用。它基本上让您与 GDB 交谈,就好像您是坐在 gdb shell 前面的用户一样。因此,弄清楚如何在 GDB 中执行您想要的操作,然后使用 libgdb 以编程方式执行此操作。
如果你想在底层做(不要那样做,很麻烦,实际上GDB确实是你想要使用的)你可以直接使用Binary File Descriptor Library来解析和表示核心转储。它是 GDB 的重要组成部分,如果不重新实现大量 GDB 例程,很难让它与您自己的 C++ 程序一起运行。
【讨论】: