我正在研究Linux环境。我有两个'C'源包train和test_train。
现在我想使用gprof生成一个调用图,它显示主程序中的函数调用顺序以及libtrain.so中的函数调用
我正在使用-pg选项编译和链接两个包,调试级别为o0。 在我执行./train-test之后,生成gmon.out。然后我做:
$ gprof -q ./train-test gmon.out
这里,输出显示列车测试中函数的调用图,但不显示libtrain.so
可能是什么问题?
答案 0 :(得分:19)
gprof
不起作用,您需要使用sprof
。我发现这些链接很有用:
第二个链接摘要:
我发现在第2步中,它需要是一个现有目录 - 否则你会得到一个有用的警告。在第3步中,您可能需要将库指定为libmylib.so.X
(甚至可能.X.Y
,但不确定) - 否则您不会收到任何警告。
答案 1 :(得分:2)
我从Python加载我的库并且没有sprof
的运气。相反,我使用了oprofile
,它位于Fedora存储库中,至少是:
operf --callgraph /path/to/mybinary
等待您的应用程序完成或执行Ctl-c以停止分析。现在让我们生成个人资料摘要:
opreport --callgraph --symbols
请参阅documentation进行解释。这有点乱。在生成的报告中,每个符号都列在自己的块中。该块的主要符号是不缩进的符号。它上面的项是调用该函数的函数,而它下面的函数是由它调用的函数。以下部分中的百分比是它们在这些被监禁者中花费的相对时间。
答案 2 :(得分:0)
如果您不在Linux上(就像我在Solaris上一样),那么你运气不好,因为那里没有sprof
。
如果您拥有库的源代码,则可以通过链接静态库并使用该库来创建分析二进制文件来解决您的问题。
我设法跟踪对共享库的调用的另一种方法是使用truss
。使用选项-u [!]lib,...:[:][!]func, ...
,可以很好地了解运行的呼叫历史记录。它与分析不完全相同,但在某些情况下可能非常有用。