Gdb 如何调试在dlopen()和#x27;ed插件?

Gdb 如何调试在dlopen()和#x27;ed插件?,gdb,coredump,dlopen,postmortem-debugging,Gdb,Coredump,Dlopen,Postmortem Debugging,我有一个用户的核心转储。主程序通过dlopen加载选定的插件。插件模块中的进程中止。用户提供了一个回溯,其中包括插件的文件名,以及它中止的函数 我需要查看数据,例如传递给函数的参数。我如何告诉gdb插件是在哪里加载的,这样它就可以知道如何显示源代码和数据了 我如何告诉gdb插件是在哪里加载的,这样它就可以知道如何显示源代码和数据了 GDB应该自动执行此操作(加载地址包含在核心中) 您所需要做的就是提供与客户环境完全匹配的二进制文件。另请参见。如果核心文件良好,那么它应该包含崩溃的调用堆栈。您指出

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

我需要查看数据,例如传递给函数的参数。我如何告诉gdb插件是在哪里加载的,这样它就可以知道如何显示源代码和数据了

我如何告诉gdb插件是在哪里加载的,这样它就可以知道如何显示源代码和数据了

GDB应该自动执行此操作(加载地址包含在
核心
中)


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

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

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

如果你分享bt,我可以给出一些更明确的建议


如前所述,本地可执行和共享库必须与客户端按位相同。如果本地版本不同,它将放弃gdb在核心和可执行文件之间的映射。这通常会导致垃圾,但有时会导致堆栈看起来模糊不清。因此,程序员花时间寻找虚假线索。这种情况真的很严重

我猜程序的二进制文件一定有点不同。我正在让用户发送他的。