为啥循环摘要在 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]
----------------------------------------

但是,我的 &lt;cycle as a whole&gt; 条目中没有列出任何呼叫者。他们都是这样的:

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 的调用图输出中没有任何调用者?的主要内容,如果未能解决你的问题,请参考以下文章

使用 gprof 和 boost

为啥使用 gprof 会阻止程序的执行?

自动装配循环级别分析

使用gprof显示模板化方法的调用图的参数格式?

为啥 gprof 告诉我一个只从 main() 调用一次的函数被调用了 102 次?

gprof 输出不准确