【问题标题】:GDB cannot open shared objectGDB 无法打开共享对象
【发布时间】:2016-09-14 09:36:47
【问题描述】:

我有一个在这里多次讨论过的问题:应用程序在直接从 shell 启动时运行,而当我尝试在同一个 shell 的调试器中启动它时不运行。在 GDB 中运行会产生“无法打开共享对象”错误。

我已阅读所有帖子并提出了所有建议:

  1. 我手动设置 LD_LIBRARY_PATH 并验证我的应用程序运行并且 ldd -r 无错误通过
  2. 我在 GDB 中将 solib-search-pathsolib-absolute-prefix 分别设置为与 LD_LIBRARY_PATH 和 '/' 相同的值。所有的路径都是绝对的
  3. 我使用strace 运行 GDB 以查看 GDB 在哪里查找所需的共享库,发现它忽略了来自 LD_LIBRARY_PATH / solib-search-path 的目录列表

我能做什么?

它是带有 RHEL 7 的 GDB 7.11.1

【问题讨论】:

  • 您是否尝试过附加到正在运行的进程?在这种情况下,gdb 将使用 /proc 信息

标签: gdb


【解决方案1】:

我有问题

如果你这样做了,那么你在描述你的问题实际上是什么方面做得很糟糕。

我用 strace 运行 GDB 以查看 GDB 在哪里查找所需的共享库,发现它忽略了目录列表

GDB 不会寻找任何共享库,直到运行时加载器通知它某些共享库已添加到进程中。

如果您没有附加到运行中的低级,那么 GDB 就不会寻找任何库,您可能得出了一个完全错误的结论。

附: GDB 使用LD_LIBRARY_PATH 根本,并且通常也不需要设置solib-search-pathsolib-absolute-prefix(除非你正在进行远程调试,或分析来自不同机器的core)。

更新:

应用程序在直接从 shell 启动时运行,而当我尝试在调试器中启动它时不运行

在我见过的 99.9% 的案例中,发生这种情况是因为 ~/.bashrc 或某些此类重置 LD_LIBRARY_PATH 不当。 GDB 启动一个 shell 以在其中运行应用程序,并且如果该(非交互式)shell 重置环境,应用程序在 GDB 内部和外部的行为可能不同。

正确的解决方案是让~/.bashrc(或任何适合您的shell 的shell 启动文件)在非交互运行时不执行任何操作。

【讨论】:

  • 非常感谢!这就是问题所在。
猜你喜欢
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2011-02-06
  • 2013-05-05
  • 1970-01-01
  • 2017-05-21
  • 2012-05-24
相关资源
最近更新 更多