为啥循环摘要在 gprof 的调用图输出中没有任何调用者?
Posted
技术标签:
【中文标题】为啥循环摘要在 gprof 的调用图输出中没有任何调用者?【英文标题】:Why don't cycle summaries have any callers in gprof's call-graph output?为什么循环摘要在 gprof 的调用图输出中没有任何调用者? 【发布时间】:2009-05-08 06:01:14 【问题描述】:我使用 GNU gprof 2.15.94.0.2.2 对我的 C++ 程序进行分析,该程序的调用周期很大。我希望在调用图输出中看到如下内容gprof's documentation indicates:
index % time self children called name
----------------------------------------
1.77 0 1/1 main [2]
[3] 91.71 1.77 0 1+5 <cycle 1 as a whole> [3]
1.02 0 3 b <cycle 1> [4]
0.75 0 2 a <cycle 1> [5]
0 0 6/6 c [6]
----------------------------------------
但是,我的 <cycle as a whole>
条目中没有列出任何呼叫者。他们都是这样的:
index % time self children called name
----------------------------------------------
[8] 65.6 259.55 5342.63 9334767+60122608 <cycle 2 as a whole> [8]
133.28 2051.45 12043564+74015448 foo <cycle 2> [14]
18.90 976.38 2379645 bar <cycle 2> [21]
...
-----------------------------------------------
由于我的周期很大,很难在一个周期中通过单个函数跟踪调用者。
谁能告诉我为什么输出中缺少循环调用者,以及如何让它们出现?
【问题讨论】:
【参考方案1】:您的应用程序是否使用多线程? gprof 根本不适用于线程。否则,您很可能在 gprof 中遇到了错误。它充满了错误并且已经过时。最好使用 oprofile 或 valgrind 之类的东西。
【讨论】:
【参考方案2】:我甚至将其称为 gprof 中的错误。我设置了一个相互递归函数的简单示例,并得到了与您完全相同的行为。我有函数:
int a(int n)return b(n);
int b(int n)return c(n);
int c(int n)return (n==0)?n:a(n-1);
还有一个 main():
for(int j=0; j <1000; ++j)
for(int i=0; i < 10; ++i)
cout << a(i);
我尝试将调用 a() 替换为:
int d(int n)return a(n);
希望 gprof 能够比 main() 更好地注册从 d() 到循环的调用,但我得到了相同的结果。
我还用 printf() 替换了 cout 并编写了一个 C 程序,结果与没有为循环列出调用者的结果相同。
【讨论】:
如果您阅读第 8 页底部的the original gprof paper,您会发现作者并没有声称其递归处理有多大用处。【参考方案3】:这是您主要关心的问题,还是您有更大的目标,比如尝试找到可以优化的东西?通常,这就是人们使用 gprof 的原因。
gprof is what it is, but you can do better.
【讨论】:
以上是关于为啥循环摘要在 gprof 的调用图输出中没有任何调用者?的主要内容,如果未能解决你的问题,请参考以下文章