gprof报告没有时间积累

问题描述 投票:24回答:7

我正在尝试在运行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

有任何想法吗?

c++ macos unix gprof
7个回答
11
投票

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

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


5
投票

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

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

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

谢谢!


2
投票

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


2
投票

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

这是我多年来成功使用的多线程问题的solution


2
投票

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


2
投票

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

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

这对我来说很有把戏。


0
投票

gprof中的时间精度是0.00。所以也许你的模块花费更少的时间(毫秒/微秒)。因此,它将显示0.00并且没有时间累积。所以,运行关于1000/1000000 times的整个程序,以便它将达到秒。最后,将获得的时间与你的循环因子(1000/1000000),这将是你的处理时间。我也面临同样的问题,通过这样做,它得到了解决。

© www.soinside.com 2019 - 2024. All rights reserved.