代码之家  ›  专栏  ›  技术社区  ›  an0

为什么循环摘要在gprof的调用图输出中没有任何调用者?

  •  2
  • an0  · 技术社区  · 15 年前

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

    因为我的循环非常大,所以很难通过一个循环中的单个函数来跟踪调用者。

    有人能告诉我为什么输出中缺少循环调用程序,以及如何让它们出现吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Gunther Piez    14 年前

    你的应用程序使用多线程吗?gprof根本不能处理线程。否则,您很可能在gprof中遇到错误。它到处都是虫子,已经过时了。最好使用oprofile或valgrind之类的工具。

        2
  •  0
  •   Dan Hook    14 年前

    我要把这个叫做gprof中的bug。我建立了一个相互递归函数的简单示例,得到了与您完全相同的行为。我有一些功能:

    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能够注册一个对d()的循环调用,而不是对main()的调用,但是我得到了相同的结果。

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

        3
  •  0
  •   Community Egal    7 年前

    这是你主要关心的问题,还是你有一个更大的目标,比如试图找到你可以优化的东西?通常,这就是人们使用 gprof公司 .

    gprof is what it is, but you can do better.