如何使用GDB调试共享库?

时间:2016-06-05 12:34:25

标签: gdb shared-libraries

我想调试由 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)。

1 个答案:

答案 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在添加(或删除)任何新共享库后停止。