28

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

有任何想法吗?

4

7 回答 7

11

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

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

于 2009-06-23T19:29:45.350 回答
5

我想我可能会分享我最近遇到的这个 Apple 邮件列表讨论。

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

我已经求助于 Dave Rigby 建议的 Shark。

谢谢!

于 2009-06-24T02:12:38.843 回答
5

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

于 2011-10-13T06:04:33.643 回答
4

你的程序运行速度有多快?如果它非常快,那么实际配置文件可能太快了。我在使用一个非常简单的文本处理程序时遇到了这个问题:当我使用低于 1kb 的测试文件运行它时,它在时间列中报告了全 0。我通过运行《了不起的盖茨比》的整个文本来解决这个问题。尝试更大的数据集或循环主计算数百次。

于 2009-06-23T19:35:25.680 回答
4

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

这是我过去成功使用的多线程问题的解决方案。

于 2009-06-23T19:43:02.000 回答
2

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

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

这对我有用。

于 2014-01-26T00:19:50.473 回答
0

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

于 2018-09-18T07:08:32.143 回答