Debugging 如何在尚未加载到gdb的共享库中的函数上设置断点
我有一个共享库Debugging 如何在尚未加载到gdb的共享库中的函数上设置断点,debugging,gdb,shared-libraries,breakpoints,Debugging,Gdb,Shared Libraries,Breakpoints,我有一个共享库libtest.so,它将使用dlopen加载到主程序中。函数test()位于libtest中。因此将通过dlsym在主程序中调用。有没有办法在测试中设置断点 请注意,主程序在链接期间未链接到libtest.so。否则,我应该能够设置断点,尽管它是一个挂起的操作。在我的例子中,当我执行b测试时,gdb将告诉我函数“test”未定义实际上,gdb应该告诉您,在将来加载新库时,它能够解析符号: (gdb) b test Function "test" not defined. Make
libtest.so
,它将使用dlopen
加载到主程序中。函数test()
位于libtest中。因此
将通过dlsym
在主程序中调用。有没有办法在测试中设置断点
请注意,主程序在链接期间未链接到libtest.so
。否则,我应该能够设置断点,尽管它是一个挂起的操作。在我的例子中,当我执行b测试时,gdb将告诉我函数“test”未定义
实际上,gdb应该告诉您,在将来加载新库时,它能够解析符号:
(gdb) b test
Function "test" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (test) pending.
(gdb) r
稍后加载.so对象后,它将解析断点,例如:
Reading symbols for shared libraries . done
Breakpoint 1 at 0xcafebebe
Pending breakpoint 1 - "test" resolved
实际上,这种方法并不总是有效的
假设我有几个共享库,每个库都有一个名为“Init”的函数。如果我加载了另一个库,那么“b Init”将把断点设置为函数“Init”的错误实例。所以我必须像这样指定断点:
(gdb)b目标5.c:66
没有名为object5.c的源文件
如何在共享库上设置断点
在共享库中有断点是很常见的。共享库可以在程序执行时显式加载和卸载,也可以重复加载和卸载。为了支持此用例,gdb会在加载或卸载任何共享库时更新断点位置。通常,您会在调试会话开始时、库未加载时以及库中的符号不可用时,在共享库中设置断点。当您尝试设置断点时,gdb将询问您是否要设置一个地址尚未解析的所谓挂起断点断点
引自
(gdb)b目标5.c:66
没有名为object5.c的源文件
也许您可以使用“设置目录\u object5.c\u文件的\u位置”来修复它。另一种方法是指定文件名和顺序函数,例如:
b object5.c:test
这应该是独一无二的。也许您还希望通过以下方式指定源代码的路径(如前所述):
加载libtest.so
withdlopen
?在我使用的GDB上,即使我“set breakpoint pending on”(设置断点挂起),如果符号未定义,它也不会询问我是否需要挂起行为。它只是告诉我“找不到成员bla-bla-Hint-try-tab-bla-bla”,在我的例子中,我发现的问题是我必须使用调试符号进行编译(在自定义.so中放置断点)。
set directories path_of_object5.c