如何调试在dlopen()' ed插件中中止的核心转储?

时间:2017-01-06 17:33:58

标签: gdb coredump dlopen postmortem-debugging

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

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

2 个答案:

答案 0 :(得分:3)

  

如何告诉gdb加载插件的位置,以便了解如何显示源和数据?

GDB应该自动执行 (加载地址包含在core内)。

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

答案 1 :(得分:1)

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

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

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

正如Employed Russian指出的那样,本地可执行文件和共享库必须与客户端按位相同。如果本地版本不同,它将抛弃gdb在核心和可执行文件之间进行的映射。这通常会导致垃圾,但有时会导致堆栈看起来模糊不清。结果,程序员花时间追逐虚假的线索。这种情况真的很恶心!