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
with
dlopen
?在我使用的GDB上,即使我“set breakpoint pending on”(设置断点挂起),如果符号未定义,它也不会询问我是否需要挂起行为。它只是告诉我“找不到成员bla-bla-Hint-try-tab-bla-bla”,在我的例子中,我发现的问题是我必须使用调试符号进行编译(在自定义.so中放置断点)。
set directories path_of_object5.c