我在Linux环境下工作。我有两个“C”源包train和test_train。
现在,我想使用gprof生成一个调用图,它显示主程序中函数的调用序列以及libtrain.so中的函数调用序列
我使用-pg选项编译和链接这两个包,调试级别是o0。在我执行./train-test之后,将生成gmon.out。然后我就做了:
$ gprof -q ./train-test gmon.out
在这里,输出显示了训练测试中的函数调用图,但不显示在libtrain.so中
可能的问题是什么?
发布于 2011-02-10 23:40:17
gprof
将不起作用,您需要使用sprof
。我发现这些链接很有帮助:
来自第二个链接的摘要:
pwd
我发现在步骤2中,它需要是一个现有的目录--否则您会得到一个有用的警告。在步骤3中,您可能需要将库指定为libmylib.so.X
(甚至可能是.X.Y
,不确定) --否则您将不会得到任何警告。
发布于 2016-10-28 04:51:21
我正在从Python加载我的库,但在使用sprof
时没有遇到任何问题。相反,我使用的是oprofile
,它至少在Fedora存储库中:
operf --callgraph /path/to/mybinary
等待应用程序完成或按Ctl-c组合键停止分析。现在让我们生成一个配置文件摘要:
opreport --callgraph --symbols
请参阅documentation对其进行解释。有点乱。在生成的报告中,每个符号都列在其自身的块中。块的主要符号是未缩进的符号。它上面的项是调用该函数的函数,它下面的项是它调用的东西。下面部分中的百分比是它在这些被调用者中花费的相对时间量。
发布于 2011-09-01 23:01:58
如果你不在Linux上(就像我在Solaris上),那你就倒霉了,因为那里没有sprof
。如果你有你的库的源代码,你可以通过链接一个静态库来解决你的问题,而不是用它来创建你的分析二进制文件。我设法跟踪对共享库的调用的另一种方法是使用truss
。使用-u [!]lib,...:[:][!]func, ...
选项,可以很好地了解一次运行的调用历史。它与分析并不完全相同,但在某些情况下可能非常有用。
https://stackoverflow.com/questions/1838989
复制相似问题