为什么不';t循环摘要在gprof'中有任何调用方;s调用图输出? 我使用GNGPROF2.2.94.0.2.2来做我的C++程序的剖析,它有很大的调用周期。我希望在调用图输出中看到如下内容: 索引%time自身子项调用名称 ---------------------------------------- 1.77 0 1/1干管[2] [3] 91.71 1.77 0 1+5 [3] 1.0203B[4] 0.75 0 2 a[5] 0 6/6 c[6] ----------------------------------------

为什么不';t循环摘要在gprof'中有任何调用方;s调用图输出? 我使用GNGPROF2.2.94.0.2.2来做我的C++程序的剖析,它有很大的调用周期。我希望在调用图输出中看到如下内容: 索引%time自身子项调用名称 ---------------------------------------- 1.77 0 1/1干管[2] [3] 91.71 1.77 0 1+5 [3] 1.0203B[4] 0.75 0 2 a[5] 0 6/6 c[6] ----------------------------------------,c++,profiling,gprof,call-graph,C++,Profiling,Gprof,Call Graph,但是,我的条目中没有列出任何呼叫者。它们都是这样的: 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 120435

但是,我的
条目中没有列出任何呼叫者。它们都是这样的:

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]
...                                                                      
-----------------------------------------------
索引%time自身子项调用名称
----------------------------------------------
[8]     65.6    259.55  5342.63  9334767+60122608  [8]
133.28 2051.45 12043564+74015448 foo[14]
18.90 976.38 2379645巴[21]
...                                                                      
-----------------------------------------------
由于我的周期相当大,因此很难在一个周期中通过单个函数跟踪调用者


有人能告诉我为什么循环调用程序在输出中丢失,以及如何使它们显示出来吗?

我将把这称为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);}
和一个主要的()

希望gprof注册从d()到循环的调用比从main()到循环的调用更好,但我得到了相同的结果


我还用printf()替换了cout,并编写了一个C程序,结果与循环中没有列出调用程序的结果相同。

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


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

如果您阅读第8页底部的内容,您会发现作者并没有声称其递归处理有多大用处。
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);
int d(int n){return a(n);}