C gprof:如何为链接到主程序的共享库中的函数生成调用图
我在Linux环境下工作。我有两个“C”源程序包train和test_trainC gprof:如何为链接到主程序的共享库中的函数生成调用图,c,debugging,profiling,gprof,sprof,C,Debugging,Profiling,Gprof,Sprof,我在Linux环境下工作。我有两个“C”源程序包train和test_train 编译时,train包生成libtrain.so 测试列车链接到libtrain.so并生成可执行列车测试 现在我想用gprof生成一个调用图,它显示主程序中函数的调用序列以及libtrain.so中的函数的调用序列 我正在使用-pg选项编译和链接这两个包,调试级别为o0。 完成/列车测试后,生成gmon.out。那么我会: $ gprof -q ./train-test gmon.out 这里,输出显示train
$ gprof -q ./train-test gmon.out
这里,输出显示train test中函数的调用图,但不显示libtrain.so中函数的调用图
有什么问题吗
gprof
不起作用,您需要使用sprof
。我发现这些链接很有用:
libmylib.so.X
(甚至可能.X.Y
,不确定)--否则您将不会得到任何警告。如果您不在Linux上(就像我在Solaris上一样),您只是运气不佳,因为那里没有sprof
。
如果您有库的源代码,您可以通过链接一个静态库并使用该库生成分析二进制文件来解决问题。
另一种跟踪共享库调用的方法是使用
truss
。使用选项-u[!]lib,…:[:][!]func,…
可以很好地了解跑步的呼叫历史记录。它与评测不完全相同,但在某些情况下非常有用。我正在从Python加载我的库,没有任何运气使用sprof
。相反,我使用了Fedora存储库中的oprofile
,至少:
operf--callgraph/path/to/mybinary
等待应用程序完成,或执行Ctl-c以停止分析。现在,让我们生成一个概要文件摘要:
opreport--callgraph--symbols
请参阅第页以解释它。有点乱。在生成的报告中,每个符号都列在其自己的块中。块的主符号是未缩进的符号。上面的项是调用该函数的函数,下面的项是它调用的对象。下面部分中的百分比是它在这些被调用方中花费的相对时间量。值得注意的是,通常您可以通过在应用程序上运行
ldd
计算出二进制文件试图加载的库的名称(mylib.so vs mylib.so.1 vs mylib.so.1.1等)。仅当库通过直接dlopen调用打开时,才应该没有条目。太糟糕了,sprof崩溃非常严重,例如,如果为我的项目选择的编译器MinGW没有提供sprof,该怎么办?运行加载库的程序后,运行sprof并出现以下错误:ld.so:dl open.c:635:_dl\u open:Assertion`\u dl\u debug\u initialize(0,args.nsid)->r\u state==RT\u CONSISTENT'失败!"