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