【问题标题】:GDB does not break in dynamically-loaded .so file?GDB 不会中断动态加载的 .so 文件?
【发布时间】:2011-08-02 10:11:00
【问题描述】:

在我的 Linux 系统中,我正在编写一个在运行时动态加载一些 .so 库的程序。就像这样:可执行程序在开始运行时会在特定目录下搜索,然后加载该目录下的所有 .so 文件。请注意可执行文件和 .so 是独立构建的,并且可执行文件的构建链接到 .so 文件。

我的问题是:在我运行附加了 GDB 的程序(因此所有 .so 库都已加载)后,我似乎能够在 .so 文件中的代码上设置断点(GDB 提示我此断点设置在共享库中),但此断点实际上从未中断。

我应该如何使这些断点真正起作用? 在调试会话期间,我在正确的位置拥有所有可用的源代码,并且 -g 选项处于打开状态。我在编译时也去掉了 -O2 优化。

【问题讨论】:

  • GDB 给出的关于断点在 SO 中的提示是什么?我没有看到这样的消息。也许是“使断点在未来共享库加载时挂起?(y 或 [n])”消息?如果是这样,那是因为 GDB 不知道您的符号。
  • 您介意显示相关代码吗?特别是dlopen() 调用(标志)和后续使用。

标签: linux gdb shared-libraries


【解决方案1】:

检查是否为 .so 文件正确加载了调试信息。查看命令(gdb) info sharedlibrary 的输出。如果您的库在加载的库表中带有星号 (*) 符号,则说明未加载调试符号并且 gdb 无法在此 .so 中的断点处停止。

【讨论】:

    【解决方案2】:

    也许你的函数永远不会被调用。在共享库的入口点放置一个断点(主程序使用dlsym 获取的函数)。我刚刚验证了我的gdb (7.1) 确实在这样的断点处停止。

    如果你绝对确定你的函数被调用了(比如说,它产生了一些你可以看到的独特的输出)但是你在它上面设置的断点没有被触发,那么这是gdb 中的一个错误,应该报告给gdb 维护者。

    【讨论】:

      【解决方案3】:

      上一次发生在我身上,我在 gdb 中运行

      info sharedlibrary
      

      我才意识到我有多个版本的库,一个是用调试符号构建的,另一个是没有调试符号的。 gdb 正在挑选一个没有的。

      【讨论】:

      • 您的答案已包含在其他答案中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 2014-12-26
      相关资源
      最近更新 更多