如何使用GDB调试共享库?

4

我想调试一个被Main调用的SharedLib。我有SharedLib和Main的源代码。我使用选项–g3编译和链接Main和SharedLib。变量PATHLD_LIBRARY_PATH包括/PathToSharedLib。我在FileOfSharedLib.cNNN处设置了一个断点。

(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)

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

1个回答

8

这个断点被Main多次调用,但程序不会停在这里。

这意味着GDB存在一个bug。不幸的是,你使用的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了,你需要在主可执行文件中的某个位置设置一个临时断点。

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


2
对于其他人寻找这个答案:对我来说,gdb成功地通过这种方式设置了断点,但仍然在完成之前运行而没有停在断点处,尽管日志表明函数已执行。问题是它在子进程中执行。您可以使用follow-fork-mode或detach-on-fork来设置gdb对子进程的处理。 - Henrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接