7

我曾尝试使用 ltrace。我尝试使用以下命令来分析程序使用的 library.so 文件sampleappltrace -c -T --library=library.so --output=out.txt ./SampleApp. 但它显示了上述错误。但是 library.so 是一个调试版本。所以符号表应该在那里。我试图用objdump --source library.so | grep CreateSocket(). 它返回使用该 CreateSocket() 函数的代码。这意味着它包含一个符号表。比为什么会发生这个错误?

相关文章:测量动态链接库的每秒 CPU 使用率

4

1 回答 1

2

这取决于如何创建可执行文件SampleApp。如果它是静态链接的,您将看到该错误。ltrace 仅适用于动态链接的应用程序。

您可以运行ldd SampleApp以显示共享对象依赖项。它是动态链接的,并且依赖于 libc,其输出ldd将包含如下一行:

libc.so.6 => /usr/lib/libc.so.6 (0x00007fb24ac53000)

在这种情况下,您可以使用 ltrace 选项--library=libc.so.6,它应该可以工作。但是,--library=libc.so将不匹配(您不会收到错误,但不会匹配任何库调用)。

当静态链接时,ldd SampleApp将改为显示此输出:

    not a dynamic executable

我的猜测是因为静态链接可能是错误的。然而,重要的一点是,如果 ltrace 显示此错误,您必须从可执行文件本身(二进制文件)及其创建方式(链接器选项)开始诊断,而不是在共享库中开始诊断。

问题ltrace(库跟踪工具)如何工作?有一些很好的参考资料可以更多地了解 ltrace 的内部结构。

于 2017-07-25T22:41:34.063 回答