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

relationship between virtual memory and core dump

本文关键字:关系 之间 转储 核心 虚拟内存      更新时间:2023-10-16

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

我用gcore创建了core dump文件

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

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

我知道core dump是一个可执行文件的内存转储,

。gdb中的核心转储(gcore表示您正在使用它)通常是ELF格式,因此有一个扩展的头文件定义什么映射到什么。

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

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

如果您想读取核心转储文件,那么正确的做法是使用GDB的功能来读取。幸运的是,有libgdb,它正好为您的C/c++应用程序做了这一点。它基本上让您与GDB对话,就好像您是坐在GDB shell前的用户一样。因此,找出如何在GDB中做您想做的事情,然后使用libgdb以编程方式完成它。

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