【问题标题】:how to set breakpoint on function in a shared library which has not been loaded in gdb如何在尚未加载到 gdb 的共享库中的函数上设置断点
【发布时间】:2011-02-08 05:40:21
【问题描述】:

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

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

【问题讨论】:

  • 在用dlopen 加载libtest.so 后,你能在test 上设置一个断点吗?

标签: debugging gdb shared-libraries breakpoints


【解决方案1】:

实际上 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

【讨论】:

  • 在我使用的 GDB 上,即使我“设置断点挂起”,如果符号未定义,它也不会询问我是否想要挂起的行为。它只是告诉我“找不到成员 bla bla 提示尝试 tab bla bla”
【解决方案2】:

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

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

(gdb) b object5.c:66

没有名为 object5.c 的源文件。

【讨论】:

  • 在我的情况下,我发现我必须使用调试符号进行编译(在自定义 .so 中放置断点)。
【解决方案3】:

另一种方法是指定文件名和der函数,例如:

b object5.c:test

这应该是唯一的。也许您还想通过以下方式指定源代码的路径(如前所述):

set directories path_of_object5.c

【讨论】:

    【解决方案4】:

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

    在共享库中设置断点是很常见的。共享库可以在程序执行时显式加载和卸载,并且可能重复加载。为了支持这个用例,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”来修复它。

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      相关资源
      最近更新 更多