gprof报告没有时间积累

时间:2009-06-23 06:01:22

标签: c++ macos unix gprof

我正在尝试在运行OSX 10.5.7的计算机上使用gprof配置C ++应用程序。 我用通常的方式用g ++编译,但是使用-pg标志,运行应用程序并尝试用gprof查看调用图。

不幸的是,我的调用图包含所有时间列的所有零。 “被调用”列中的值具有合理的值,因此看起来有些内容被分析但我对其他数据的缺乏感到困惑。

我的所有源文件都以类似的方式编译:

g++ -pg -O2 -DNDEBUG -I./ -ansi -c -o  ScenarioLoader.o ScenarioLoader.cpp

然后我运行'ar'将所有目标文件捆绑到一个库中。 后来,我链接并运行gprof:

g++ -pg -lm  -o vrpalone vrpalone.o ../src/atomicprof.a lastbuild.o
./vrpalone
gprof gmon.out | less

有什么想法吗?

7 个答案:

答案 0 :(得分:11)

如果您的程序以非干净的方式终止,那么配置文件数据将无法正确写入 - 您的程序如何退出?

无论如何,我强烈建议使用Shark而不是gprof - 它非常易于使用,并且几乎在各方面都优于gprof - 并且不需要您重新编译程序。

答案 1 :(得分:5)

我想我可能会分享我最近遇到的this Apple mailing list discussion

这里描述的行为正是我所经历的。 看起来gprof已经在OSX上被打破了很长一段时间。

我使用了Dave Rigby帮助建议的Shark。

谢谢!

答案 2 :(得分:2)

你的程序运行速度有多快?如果它非常快,实际配置可能太快。我在一个非常简单的文本处理程序中遇到了这个问题:当我用我的sub-1kb测试文件运行它时,它报告了时间列中的所有0。我通过运行The Great Gatsby的全文来解决这个问题。尝试更大的数据集或循环几次主计算。

答案 3 :(得分:2)

您的程序是否使用多个线程?我在Linux上遇到过多线程程序这个问题,不确定OS X是否会出现同样的问题

这是多线程问题的solution,我过去曾成功使用过这个问题。

答案 4 :(得分:2)

或许与OP的问题无关,有一个常见的情况是“没有时间累积”发生:如果你的代码调用内核或调用未使用-pg编译的库,你将看不到任何时间积累在那里度过的时间。

答案 5 :(得分:2)

顺便问一下,你在代码中fork()吗? 如果是这样,请在fork()之后的子进程中添加它:

extern void _start (void), etext (void);
monstartup ((u_long) &_start, (u_long) &etext);

这对我有用。

答案 6 :(得分:0)

gprof中的时间精度为0.00。所以也许您的模块花费更少的时间  (毫秒/微秒)。因此,它将显示0.00且没有时间累积。因此,请在1000/1000000 times上运行整个程序,以使其变为秒。最后,将获得的时间除以您的循环因子(1000/1000000),这将成为您的处理时间。我也面临同样的问题,这样做可以解决。

相关问题