【问题标题】:How do I debug a core dump that aborted in a dlopen()'ed plugin?如何调试在 dlopen()'ed 插件中中止的核心转储?
【发布时间】:2017-01-06 17:33:58
【问题描述】:

我有一个用户的核心转储。主程序通过dlopen 加载选定的插件。该进程在插件模块中中止。用户提供了一个回溯,其中包括插件的文件名,以及它中止的函数。

我需要查看数据,例如传递给函数的参数。如何告诉 gdb 插件的加载位置,以便它可以弄清楚如何显示源和数据?

【问题讨论】:

    标签: gdb coredump dlopen postmortem-debugging


    【解决方案1】:

    我如何告诉 gdb 插件的加载位置,以便它知道如何显示源和数据?

    GDB 应该自动完成(加载地址包含在core 中)。

    您需要做的就是提供与客户环境完全匹配的二进制文件。另见this answer

    【讨论】:

    • employed-russion 和@matthew-fisher 我猜程序的二进制文件一定有点不同。我让用户发送他的。
    【解决方案2】:

    如果核心文件是好的,那么它应该包含崩溃的调用堆栈。您表示崩溃发生在插件模块和功能中。通过“向上”堆栈,您应该能够看到崩溃点和包含函数。通常,您应该能够查看局部变量,包括函数/方法的参数。

    简而言之,只需像调试任何其他核心文件一样对其进行调试。一旦对 dlopen 的调用成功完成,共享库看起来(几乎)与启动时加载的其他库相同。

    如果你分享bt,我可以给出一些更明确的指示。

    正如 Employed Russian 所说,您的本地可执行库和共享库必须按位与您的客户端相同。如果本地版本不同,它将丢弃 gdb 在核心和可执行文件之间所做的映射。这通常会导致垃圾,但有时会导致看起来模糊正确的堆栈。结果,程序员花时间追逐错误的线索。这种情况真的很严重!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      相关资源
      最近更新 更多