在gprof输出中查看静态调用

我有一个gprof“flat profile”输出,它列出了我所有的功能,包括静态功能。 但是,对于声明为“静态”的函数,“调用”,“自我ms /调用”和“总ms /调用”列全部为空。 我也想看看这些功能的数据; 它们实际上比模块中的公共功能更有趣。 例如:

%   cumulative   self              self     total           
time   seconds   seconds    calls  ms/call  ms/call  name    
55.32      3.38     3.38                             Static_Func1
16.61      4.39     1.01                             Static_Func2
12.44      5.16     0.76        2   380.00   380.00  Public_Func1
 9.90      5.76     0.60                             Static_Func3
 2.78      5.93     0.17                             Static_Func4
 0.98      5.99     0.06 12463589     0.00     0.00  main
 0.65      6.03     0.04  1200000     0.00     0.00  Public_Func2
 0.33      6.05     0.02        2    10.00    10.00  Public_Func3
 0.33      6.07     0.02                             Static_Func5
 0.33      6.09     0.02                             free
 0.33      6.11     0.02                             malloc
 0.00      6.11     0.00        1     0.00     0.00  Public_Func4

我发现为什么gprof偶尔不打印特定功能的呼叫数量? 这就解释了为什么我没有看到这些函数的输出结果,但是除了删除静态声明之外,还有办法看到它吗? 我知道我可以使用-a禁止打印静态函数,但我想做相反的事情,但没有看到它的选项。

当我编辑代码以从上述配置文件中的静态函数中去除“static”关键字时,main的“calls”变为空(我期望1,所以这是错误的)。 更有用的是,不仅填充了字段,还列出了由这些静态函数调用的任何函数。 我希望能够在没有任何代码更改的情况下做到这一点。

我还发现是GNU gprof越野车? 这似乎也遭受同样的问题,但是解决方案是编辑代码以强制编译器不内联一些函数。 我不想仅仅为了分析而编辑我的代码,我希望能够看到我现在存在的所有函数。


版本信息,在Windows 7 64位下的MinGW shell中运行:

$ which gprof
/mingw/bin/gprof.exe

$ gprof --version
GNU gprof (GNU Binutils) 2.22
Based on BSD gprof, copyright 1983 Regents of the University of California.
This program is free software.  This program has absolutely no warranty.

我不是在尝试一个答案,而是我在cygwin遇到的同样问题的进一步延续, GNU gprof (GNU Binutils) 2.24.51.20140528 (我在Ubuntu上运行这个代码(都是32/64位)和我没有任何问题):

#include<stdio.h>
#include<stdlib.h>

#define N1 100
#define N2 100
#define N3 100
#define N4 100

#define USE_STATIC

#ifdef USE_STATIC
static
#endif
void f5() {
    int i;
    for (i = 0; i < 10; i++) {
    }
}

#ifdef USE_STATIC
static
#endif
void f4()  {
    int i;
    for (i = 0; i < N4; i++) {
        f5();
    }
}

#ifdef USE_STATIC
static
#endif
void f3() {
    int i;
    for (i = 0; i < N3; i++) {
        f4();
    }
}

void f2() {
    int i;
    for (i = 0; i < N2; i++) {
         f3();
    }
}

void f1() {
    int i;
    for (i = 0; i < N1; i++) {
        f2();
    }
}

int main() {
    f1();
    return 0;
}

USE_STATIC宏被禁用的情况下,我得到了gprof报告的这个平面数据(这似乎是合理的):

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls   s/call   s/call  name
 85.90      1.98     1.98 100000000     0.00     0.00  f5
  9.98      2.21     0.23                             _mcount_private
  3.47      2.29     0.08  1000000     0.00     0.00  f4
  0.65      2.31     0.01                             _fentry__
  0.00      2.31     0.00    10000     0.00     0.00  f3
  0.00      2.31     0.00      100     0.00     0.02  f2
  0.00      2.31     0.00        1     0.00     2.06  f1

现在,如果我启用它,这一切都会下降:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls  Ts/call  Ts/call  name
 79.48      1.82     1.82                             f5
 17.47      2.22     0.40                             _mcount_private
  2.18      2.27     0.05                             f4
  0.44      2.28     0.01                             _fentry__
  0.44      2.29     0.01                             f3
  0.00      2.29     0.00 101010000     0.00     0.00  __gcc_deregister_frame
  0.00      2.29     0.00      100     0.00     0.00  f2
  0.00      2.29     0.00        1     0.00     0.00  f1

至于我能够确定mcount()在每个函数中被正确调用,所以我不知道是什么让gprof弄糟了调用计数如此糟糕。 毕竟这应该是唯一可以输出的精确数据。 无论如何,时间信息是完全不可靠的(特别是对于快速完成的程序)。

这里有一个历史性的stackoverflow主题,列出了gprof一些更好的选择:http://archive.today/9r927

你可能想看看那里。 我知道我会...

链接地址: http://www.djcxy.com/p/43865.html

上一篇: View static calls in gprof output

下一篇: Oprofile and gprof output varies for same code