我想调试一个由Main调用的SharedLib。我有SharedLib和Main的来源。我编译并链接了 Main 和 SharedLib 和选项 –g3。变量 PATH 和 LD_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 在添加(或删除)任何新的共享库后停止。