我想调试由 Main 调用的 SharedLib 。我有SharedLib和Main的来源。我使用 -g3 选项编译和链接Main和SharedLib。变量 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)。
答案 0 :(得分:4)
它永远不会停留在由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在添加(或删除)任何新共享库后停止。