2

我使用 GNU gprof 2.15.94.0.2.2 对我的 C++ 程序进行分析,该程序的调用周期很大。正如gprof 的文档所示,我希望在调用图输出中看到如下所示的内容:

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]
...                                                                      
-----------------------------------------------

由于我的周期非常大,因此很难在一个周期中通过单个函数跟踪调用者。

谁能告诉我为什么输出中缺少循环调用者,以及如何让它们出现?

4

3 回答 3

1

您的应用程序是否使用多线程?gprof 根本不适用于线程。否则,您很可能在 gprof 中遇到了错误。它充满了漏洞并且已经过时。最好使用 oprofile 或 valgrind 之类的东西。

于 2009-11-24T16:34:45.737 回答
0

我打算将其称为 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);}

和一个主要():

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 程序,结果与没有为循环列出调用者的结果相同。

于 2009-11-23T19:32:16.793 回答
0

这是您主要关心的问题,还是您有更大的目标,例如尝试找到可以优化的东西?通常,这就是人们使用gprof的原因。

gprof就是这样,但你可以做得更好。

于 2009-11-23T19:45:42.257 回答