我遇到了这里多次讨论过的问题:应用程序在直接从shell启动时运行,当我尝试在同一个shell中的调试器中启动它时不运行。在GDB内部运行会产生“无法打开共享对象”错误。
我已阅读所有帖子,并提出了所有建议:
LD_LIBRARY_PATH
并验证我的应用运行且ldd -r
没有错误地通过solib-search-path
和solib-absolute-prefix
设置为与LD_LIBRARY_PATH和'/'相同的值。所有路径都是绝对的strace
运行GDB以查看GDB查找所需共享库的位置,并发现它忽略了LD_LIBRARY_PATH / solib-search-path 我该怎么办?
这是使用RHEL 7的GDB 7.11.1
答案 0 :(得分:1)
我有问题
如果你这样做,你在描述你的问题实际上是做得很差。
我用strace运行GDB,看看GDB在哪里查找所需的共享库,发现它忽略了目录列表
GDB 不会查找任何共享库,直到运行时加载程序通知某个共享库已添加到进程中。
如果你没有附属于一个低劣的人,那么GDB就不会寻找任何图书馆,你可能会得出一个完全错误的结论。
P.S。 GDB em>也不需要(除非你正在进行远程调试,或者分析来自不同机器的LD_LIBRARY_PATH
)。
<强>更新强>
应用程序在直接从shell启动时运行,当我尝试在调试器中启动它时不运行
在我见过的99.9%的案例中,发生这种情况是因为solib-search-path
或某些此类错误地重置 solib-absolute-prefix
。 GDB启动一个 new shell来运行该应用程序,而如果(非交互式)shell重置环境,则应用程序在GDB内外的行为可能不同。
正确的解决方案是使core
(或任何适合您的shell的shell启动文件)在非交互式运行时不执行任何操作。