我正在尝试在运行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
有任何想法吗?
如果您的程序以非干净的方式终止,那么配置文件数据将无法正确写入 - 您的程序如何退出?
无论如何,我强烈建议使用Shark而不是gprof - 它非常易于使用,并且在几乎所有方面都优于gprof - 并且不需要您重新编译程序。
我想我可能会分享我最近遇到过的this Apple mailing list discussion。
这里描述的行为正是我所经历的。看起来gprof已经在OSX上被打破了很长一段时间。
我已经使用了由Dave Rigby帮助建议的Shark。
谢谢!
你的程序运行速度有多快?如果它非常快,实际配置可能太快。我在一个非常简单的文本处理程序中遇到了这个问题:当我用我的sub-1kb测试文件运行它时,它报告了时间列中的所有0。我通过运行The Great Gatsby的全文来解决这个问题。尝试更大的数据集或循环几次主计算。
你的程序使用多个线程吗?我在Linux上遇到过多线程程序这个问题,不确定OS X会遇到同样的问题
这是我多年来成功使用的多线程问题的solution。
也许与OP的问题无关,有一个常见的情况是“没有时间累积”发生:如果您的代码调用内核或调用未使用-pg
编译的库,您将看不到任何时间累积在那里花费的时间。
顺便问一下,你在代码中fork()吗?如果是这样,请在fork()之后的子进程中添加:
extern void _start (void), etext (void);
monstartup ((u_long) &_start, (u_long) &etext);
这对我来说很有把戏。
gprof中的时间精度是0.00
。所以也许你的模块花费更少的时间(毫秒/微秒)。因此,它将显示0.00
并且没有时间累积。所以,运行关于1000/1000000 times
的整个程序,以便它将达到秒。最后,将获得的时间与你的循环因子(1000/1000000)
,这将是你的处理时间。我也面临同样的问题,通过这样做,它得到了解决。