2010-04-15 108 views
9

我有一个共享库libtest.so,它将使用dlopen加载到主程序中。函数test()驻留在libtest.so中,将通过dlsym在主程序中调用。有没有什么办法可以在test上设置一个断点?如何在共享库中的函数中设置断点,但尚未在gdb中加载

请注意主链接程序在链接期间没有链接到libtest.so。否则,我应该可以设置中断点,尽管它是一个待处理的操作。在我的情况下,当我做b test时,gdb会告诉我Function "test" not defined

+0

你可以在用'dlopen'加载'libtest.so'后在'test'上设置断点吗? – 2010-04-15 06:12:44

回答

11

其实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 
+0

在我使用的GDB上,即使我“设置了断点挂起”,如果符号未定义,它也不会问我是否需要挂起的行为。它只是告诉我“找不到成员bla bla提示尝试tab bla bla” – 2013-08-15 22:18:12

6

实际上,这种方法并不总是有效。

假设我有几个共享库,每个共享库都有一个名为“Init”的函数。如果我加载了不同的库,那么“b Init”将把断点设置为函数“Init”的错误实例。所以我必须指定这样的断点:

(GDB)b object5.c:66

命名object5.c没有源文件。

+0

在我的情况下,我发现我必须使用调试符号进行编译(将断点放入自定义.so中)。 – 2015-02-25 18:11:09

1

如何在共享库上设置断点。

[在共享库中有一个断点是很常见的。共享库可以在程序执行时显式地加载和卸载,并且可能重复地加载和卸载。为了支持这种用例,每当任何共享库被加载或卸载时,gdb都会更新断点位置。通常,您可以在调试会话开始时的共享库中设置断点,未装入库时以及库中的符号不​​可用。当您尝试设置断点,如果你想设置一个所谓的挂起的断点,断点,其地址还没有被解决GDB会问你。]

引自https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html

(GDB)b object5.c:66 没有名为object5.c的源文件。

也许你可以使用 “设置目录the_location_of_object5.c_file” 来修复它。

  • 列表项
0

另一种方式是指定文件名和Der功能,例如:

b object5.c:test 

这应该是唯一的。也许你还想通过以下方式指定源代码的路径(如已经建议的):

set directories path_of_object5.c