如何调试在 dlopen() 插件中中止的核心转储?
How do I debug a core dump that aborted in a dlopen()'ed plugin?
我有一个用户的核心转储。主程序通过 dlopen
加载选定的插件。该进程在插件模块中中止。用户提供了一个回溯,其中包括插件的文件名,以及它在其中中止的函数。
我需要查看数据,例如传递给函数的参数。我如何告诉 gdb 插件的加载位置,以便它可以弄清楚如何显示源和数据?
How do I tell gdb where the plugin was loaded, so it can figure out how to show the source and data?
GDB 应该自动(加载地址包含在 core
中)。
您需要做的就是提供与客户环境完全匹配的二进制文件。另见 this answer。
如果核心文件是好的,那么它应该包含崩溃的调用堆栈。您指出崩溃发生在插件模块和函数中。通过 'up' 堆栈,您应该能够看到崩溃点和包含函数。通常,您应该能够查看局部变量,包括 function/method 的参数。
简而言之,就像调试任何其他核心文件一样调试它。一旦对 dlopen 的调用成功完成,共享库看起来(几乎)与启动时加载的其他库相同。
如果你分享了bt,我可以给一些更明确的指点。
正如 Employed Russian 指出的那样,您的本地可执行文件和共享库必须与您的客户端按位相同。如果本地版本不同,它将丢弃 gdb 在核心和可执行文件之间所做的映射。这通常会导致垃圾,但有时会导致堆栈看起来模糊正确。结果,程序员花时间寻找错误线索。这种情况真是雪上加霜!
我有一个用户的核心转储。主程序通过 dlopen
加载选定的插件。该进程在插件模块中中止。用户提供了一个回溯,其中包括插件的文件名,以及它在其中中止的函数。
我需要查看数据,例如传递给函数的参数。我如何告诉 gdb 插件的加载位置,以便它可以弄清楚如何显示源和数据?
How do I tell gdb where the plugin was loaded, so it can figure out how to show the source and data?
GDB 应该自动(加载地址包含在 core
中)。
您需要做的就是提供与客户环境完全匹配的二进制文件。另见 this answer。
如果核心文件是好的,那么它应该包含崩溃的调用堆栈。您指出崩溃发生在插件模块和函数中。通过 'up' 堆栈,您应该能够看到崩溃点和包含函数。通常,您应该能够查看局部变量,包括 function/method 的参数。
简而言之,就像调试任何其他核心文件一样调试它。一旦对 dlopen 的调用成功完成,共享库看起来(几乎)与启动时加载的其他库相同。
如果你分享了bt,我可以给一些更明确的指点。
正如 Employed Russian 指出的那样,您的本地可执行文件和共享库必须与您的客户端按位相同。如果本地版本不同,它将丢弃 gdb 在核心和可执行文件之间所做的映射。这通常会导致垃圾,但有时会导致堆栈看起来模糊正确。结果,程序员花时间寻找错误线索。这种情况真是雪上加霜!