如何在未在gdb中加载的共享库中设置函数断点

时间:2010-04-15 05:39:32

标签: debugging gdb shared-libraries breakpoints

我有一个共享库libtest.so,它将使用dlopen加载到主程序中。函数test()位于libtest.so中,将通过dlsym在主程序中调用。有没有办法在test上设置断点?

请注意,在链接时,主程序尚未与libtest.so相关联。否则,我应该能够设置断点,尽管它是一个待处理的动作。就我而言,当我b test时,gdb会告诉我Function "test" not defined

4 个答案:

答案 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