【问题标题】:relationship between virtual memory and core dump虚拟内存和核心转储之间的关系
【发布时间】:2015-08-28 13:43:24
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    但是,GDB 可以读取这些标头,如果您要求它打印内容(例如,使用 printx 命令),它会为您提供正确的内容。

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

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

    【讨论】:

    • 您知道从 C++ 读取核心转储中虚拟地址数据的任何方法吗?
    • @JohnDoyle:请参阅我的答案的修改。
    • 非常感谢!你是英雄! :)
    • 从哪里获得 libgdb.a 左右的文件?如果您有更多关于如何使用 libgdb 的示例,那就太好了
    • @JohnDoyle:您通常不会真正担心这样的事情,因为构建系统会负责检测诸如 libgdb 的开发头文件和链接器选项之类的事情。所以,建立一个构建系统,并安装 libgdb 的开发包,不管是在你的 linux 发行版上调用的,还是你使用的任何东西。
    猜你喜欢
    • 2021-10-02
    • 2020-05-21
    • 1970-01-01
    • 2012-10-24
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多