如何使用 GDB 调试共享库?
How to debug a shared library using GDB?
我想调试由 Main 调用的 SharedLib。我有 SharedLib 和 Main 的来源。我使用选项 –g3 编译并 link Main 和 SharedLib。变量 PATH 和 LD_LIBRARY_PATH 包括 /PathToSharedLib。我在 b FileOfSharedLib.c at NNN.
中设置了一个断点
(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.
It never stops at the break point which is called several times by 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
ed,您需要在 dlopen
.
之后的某个地方的主要可执行文件中设置一个临时断点
另一种解决方法:set stop-on-solib-events 1
。这将使 GDB 在添加(或删除)任何新的共享库后停止。
我想调试由 Main 调用的 SharedLib。我有 SharedLib 和 Main 的来源。我使用选项 –g3 编译并 link Main 和 SharedLib。变量 PATH 和 LD_LIBRARY_PATH 包括 /PathToSharedLib。我在 b FileOfSharedLib.c at NNN.
中设置了一个断点(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.
It never stops at the break point which is called several times by 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
ed,您需要在 dlopen
.
另一种解决方法:set stop-on-solib-events 1
。这将使 GDB 在添加(或删除)任何新的共享库后停止。