【发布时间】:2011-04-29 12:14:50
【问题描述】:
一个程序安装在 2 台计算机上。某个库在一台计算机上正常工作,但在另一台计算机上根本不工作。我想知道是否缺少图书馆。
我正在使用 strace,因此我可以查看程序在运行时正在调用哪些库。 strace 提到的所有库都是正确的,但 strace 是否还检测一个库是否调用另一个库或文件?有什么方法可以检测到这种情况?
【问题讨论】:
一个程序安装在 2 台计算机上。某个库在一台计算机上正常工作,但在另一台计算机上根本不工作。我想知道是否缺少图书馆。
我正在使用 strace,因此我可以查看程序在运行时正在调用哪些库。 strace 提到的所有库都是正确的,但 strace 是否还检测一个库是否调用另一个库或文件?有什么方法可以检测到这种情况?
【问题讨论】:
是的,strace 将检测来自已加载库的调用。
如果您想跟踪库调用(不是系统调用),请使用 ltrace
【讨论】:
听起来您想查看应用的函数调用图,即哪些函数相互调用、它们所在的库等。如果是这样,您可能需要查看@987654321 @(这是 valgrind 的一部分)。
这是一个使用callgrind to profile some code 的示例。
使用 callgrind 为您的应用生成配置文件数据后,将其加载到 Kcachegrind 以将其可视化。这是简单的点击:突出显示功能,查看调用者/被调用者,查看调用图,等等。我发现它在类似情况下非常有用。
【讨论】:
要检查缺少的库,请运行 ldd /full/path/to/program
【讨论】:
对于使用Clang 编译的程序,尝试获取Xray 程序的调用跟踪。它启发式地检测程序的一部分,并且运行时开销非常低。
【讨论】: