如何使用 GDB 调试共享库



我想调试一个由Main调用的SharedLib。我有SharedLib和Main的来源。我编译并链接了 Main 和 SharedLib 和选项 –g3。变量 PATHLD_LIBRARY_PATH 包括 /PathToSharedLib。我在 NNN的 b FileOfSharedLib.c 中设置了一个断点。

(gdb) file /PathToMain/Main
Reading symbols from /PathToMain/Main...done.
(gdb) set directories /PathToSourceOfSharedLib
(gdb) set solib-search-path /PathToSharedLib
(gdb) sharedlibrary SharedLib
No loaded shared libraries match the pattern `SharedLib`
(gdb) b FileOfSharedLib.c:NNN
No source file named FileOfSharedLib.c.
Make breakpoint pending on future shared library load? (y or [n]) y
(gdb) run

它永远不会停止在 Main 多次调用的断点处。我通过 SharedLib 日志中的 printf 语句看到它。看起来 gdb 没有考虑 SharedLib。

我检查了SharedLib和FileOfSharedLib.c:

(gdb) file /PathToSharedLib/SharedLib
Reading symbols from /PathToSharedLib/SharedLibl...done.
(gdb) b FileOfSharedLib.c:123
Breakpoint 1 at 0x43d7f: file FileOfSharedLib.c, line 123.
(gdb)

我正在运行带有gcc 4.8.4和gdb 7.7.1的Ubuntu 14.04.3 LTS(GNU/Linux 3.13.0-66-generic i686)。

它永远不会停止在 Main 多次调用的断点处。

这意味着 GDB 中存在错误。不幸的是,您的 GDB 版本太旧,开发人员无法关心。尝试使用当前的 GDB 7.11.1 重现此行为,如果确实重现,请在 GDB bugzilla 中提交错误。

如果不想使用 GDB 7.11.1,可以通过在加载共享库设置断点来解决此错误。

如果库直接链接到主可执行文件,则以下顺序应该有效:

(gdb) start
# GDB stop on entry to main
(gdb) b FileOfSharedLib.c:NNN  # should find the source now

如果库是dlopen编辑的,则需要在该dlopen之后的某个位置在主可执行文件中设置一个临时断点。

另一种解决方法:set stop-on-solib-events 1 。这将使 GDB 在添加(或删除)任何新的共享库后停止。

最新更新