【发布时间】:2014-08-28 08:10:23
【问题描述】:
我有一个 gprof“平面配置文件”输出,其中列出了我的所有函数,包括静态函数。但是,对于声明为“静态”的函数,“calls”、“self ms/call”和“total ms/call”列都是空的。我也想查看这些函数的数据;它们实际上对我来说比模块中的公共功能更有趣。例如:
% 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
我找到了Why does gprof occasionally not print number of calls for particular functions?,它解释了为什么我没有看到这些函数的输出,但是除了去掉静态声明之外,还有其他方法可以看到吗?我知道我可以使用 -a 禁止打印静态函数,但我想做相反的事情并且没有看到它的选项。
当我编辑代码以从上述配置文件中的静态函数中删除“静态”关键字时,main 的“调用”变为空(我希望为 1,所以无论哪种方式都是错误的)。更有用的是,不仅填充了字段,而且这些静态函数调用的任何函数也会被列出。我希望能够在不更改任何代码的情况下做到这一点。
我还发现Is GNU gprof buggy? 似乎遇到了同样的问题,但解决方案是编辑代码以强制编译器不要内联某些函数。我不想仅仅为了分析而编辑我的代码,我希望能够看到我现在存在的所有函数。
版本信息,在 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.
【问题讨论】:
-
你能添加一个平面轮廓输出样本吗?
-
已编辑以添加示例配置文件。这是我的代码中的实际配置文件,但我大部分都删除了实际的函数名称。
-
我认为这可能是您的
binutils/gprof包中的错误。你在什么平台上运行?我在windows 7/cygwin(32 位)上遇到了非常相似的行为... -
使用 MinGW shell 在 Windows 7 64 位中运行。明天我回去工作时可以得到更多细节。