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

标签 c++ memory coredump virtual-address-space

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

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

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

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

最佳答案

I know that the core dump is a memory dump of an executable file,

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

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

但是,GDB 可以读取这些 header ,如果您要求它打印东西(例如使用 printx 命令),它会给您正确的东西。

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

如果你想在底层做(不要那样做,很麻烦,实际上 GDB 确实是你想用的)你可以直接使用 Binary File Descriptor Library解析和表示核心转储。它是 GDB 的重要组成部分,如果不重新实现大量 GDB 例程,很难让它与您自己的 C++ 程序一起运行。

关于c++ - 虚拟内存和核心转储之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32272537/

相关文章:

c++ - 基于字符串的用户定义文字可以是强类型的吗?

C++:分配对齐矩阵

memory - 为什么将值设置为 "self"会导致内存泄漏?

c# - 如何快速将数组归零?

c - Mergesort 实现中的段错误

linux - 是否可以通过核心转储定期保存程序状态?

c++ - 在 C++ 中是否已经有一些类打印到 cout 但在未定义某些宏(例如 DEBUG)时可以关闭?

java - Java中OpenCV椭圆检测的问题

java - OpenJDK 客户端 VM - 无法分配内存

c - GDB + 由另一个编译器生成的核心转储文件