我有一个可执行文件和一个gcore。
我用gcore创建了核心转储文件。
现在,我想将可执行文件的虚拟地址映射到核心转储。
我知道核心转储是一个可执行文件的内存转储,如果我想从核心转储中分析虚拟地址的话。我是否可以假设虚拟地址0x0000
等于偏移核心转储的0x0000
?
发布于 2015-08-28 13:53:07
我知道核心转储是可执行文件的内存转储,
不是的。gdb中的核心转储(gcore表示您正在使用此格式)通常采用ELF格式,因此有一个广泛的标头来定义什么映射到什么。
我不太清楚GDB/linux在转储核心时对地址空间损坏做了多少使用,但您不能假设文件偏移量x将映射到内存偏移量x --因为虚拟地址空间可以跨越巨大的地址空间,它只使用几页。(例如,64位进程可以有一个比硬盘大得多的虚拟地址空间,而它可能实际上只保留了小得多的内存,即便如此,并不是所有的页面都需要实际分配)。
但是,GDB可以读取这些头文件,如果您要求它打印内容(例如使用print
或x
命令),它将提供正确的内容。
如果您想要读取核心转储文件,那么正确的做法就是使用GDB的功能来读取。幸运的是,有libgdb,它正是用于C/C++应用程序的。基本上,让我们像坐在GDB前面的用户一样与gdb对话。因此,了解如何在GDB中执行您想要的操作,然后使用libgdb编程完成它。
如果您想要这样做,那么您可以直接使用Binary File Descriptor Library来解析和表示核心转储(不要这样做,这很麻烦,实际上,GDB正是您想要使用的)。它是GDB的重要组成部分,如果不重新实现许多GDB例程,就很难让它与您自己的C++程序一起运行。
https://stackoverflow.com/questions/32272537
复制相似问题