我正在尝试在运行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
有什么想法吗?
答案 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)
,这将成为您的处理时间。我也面临同样的问题,这样做可以解决。