我有一个可执行文件和一个gcore。
我用gcore创建了核心转储文件。
现在,我想将可执行文件的虚拟地址映射到核心转储。
我知道核心转储是可执行文件的内存转储,如果我想分析核心转储中的虚拟地址。我可以假设虚拟地址0x0000
等于核心转储的偏移0x0000
吗?
答案 0 :(得分:3)
我知道核心转储是可执行文件的内存转储,
没有。 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 ++程序一起运行。