我有一个共享库libtest.so
,它将使用dlopen
加载到主程序中。函数test()
位于libtest.so
中,将通过dlsym
在主程序中调用。有没有办法在test
上设置断点?
请注意,在链接时,主程序尚未与libtest.so
相关联。否则,我应该能够设置断点,尽管它是一个待处理的动作。就我而言,当我b test
时,gdb会告诉我Function "test" not defined
。
答案 0 :(得分:14)
实际上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
答案 1 :(得分:7)
实际上,这种方法并不总是有效。
假设我有几个共享库,每个库都有一个名为“Init”的函数。如果我加载了不同的库,那么“b Init”将断点设置为函数“Init”的错误实例。所以我必须像这样指定断点:
(gdb)b object5.c:66
没有名为object5.c的源文件。
答案 2 :(得分:1)
如何在共享库上设置断点。
在共享库中有一个断点是很常见的。在执行程序时,可以显式地并且可能重复地加载和卸载共享库。为了支持此用例,每当加载或卸载任何共享库时,gdb都会更新断点位置。通常,您将在调试会话开始时,未加载库时以及库中的符号不可用时在共享库中设置断点。当你尝试设置断点时,gdb会询问你是否要设置一个所谓的挂起断点 - 断点,其地址尚未解析。
引自https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html
(gdb)b object5.c:66 没有名为object5.c的源文件。
也许您可以使用“set directory the_location_of_object5.c_file”来修复它。
答案 3 :(得分:1)
另一种方法是指定文件名和der函数,例如:
b object5.c:test
这应该是独一无二的。也许您还想通过以下方式指定源代码的路径(如已建议的那样):
set directories path_of_object5.c