【问题标题】:How to debug a shared library using GDB?如何使用 GDB 调试共享库?
【发布时间】:2016-06-05 12:34:24
【问题描述】:

我想调试一个由 Main 调用的 SharedLib。我有 SharedLib 和 Main 的来源。我使用选项–g3 编译和链接 Main 和 SharedLib。变量 PATHLD_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)。

【问题讨论】:

    标签: gdb shared-libraries


    【解决方案1】:

    它永远不会在被 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
    

    如果库是dlopened,您需要在主可执行文件中的某个位置设置一个临时断点dlopen

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

    【讨论】:

    • 对于其他找到此答案的人:gdb 以这种方式成功地为我设置了一个断点,但仍然运行直到完成而没有在断点处停止,即使日志表明该函数已执行。问题是它是在子进程中执行的。您可以使用 follow-fork-mode 或 detach-on-fork 来设置 gdb 对子进程的处理。
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2010-10-16
    • 2020-04-28
    • 2015-03-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    相关资源
    最近更新 更多