使用gcc -pg -g
编译了一个C++程序(至少,这些是我在Makefile中给出的参数;我没有任何确凿的证据证明执行了什么命令)。程序运行正常完成,CWD设置为我的主目录。没有gmon.out文件写入。
gcc是4.4.7操作系统是centos 6。
我的程序是由一个手工滚动的Perl守护进程使用fork/exec启动的。我已经验证了CWD是我的主目录,并且它是可写的,方法是让守护进程在执行我的目标程序之前执行touch foo
。就我所能研究的而言,这不应该影响程序在终止时(正常情况下)的分析或编写gmon.out。
4条答案
按热度按时间oxiaedzo1#
在CentOS 7.
-pg
上的g++ 4.8.2中遇到了相同的问题,编译和链接都存在,运行进程并正常退出,未生成gmon.out
。我用
exit(status)
替换了对_exit(status)
的调用,修复了这个问题。注意,前者是_exit(3),一个系统调用,后者是exit(2),一个标准库方法。为什么这样做?从
gprof
手册页:被分析的程序必须调用“exit”(2)或正常返回,以便将分析信息保存在gmon.out文件中。
显然,gmon.out的编写依赖于(更高级别的)exit(2),因此,请检查代码是否使用了exit(2)(来自stdlib)和not _exit(3)(系统调用)。
hsvhsicv2#
现在已经很晚了,但是对于那些正在努力的人来说,在使用
-pg
编译代码之后,需要运行可执行文件以生成gmon.out
kuhbmx9i3#
也许你已经解决了这个问题几个月前,但我今天遇到的影响,所以我可以回答未来的游客:
没有显示错误消息,gmon.out没有创建(分析文本文件将为空)。
原因之一可能是你没有
main
方法或者在-mwindows
的情况下是WinMain
。例如,如果你使用编译器参数(gcc)-e
或(vc)/entry
或者使用__main
。我看了GPROF手册,但没有找到有关如何告诉它一个入口点的信息,所以我更改了代码。
izj3ouym4#
在我的例子中,问题是可执行文件被chdir'ing(改变当前工作目录)到其他地方,而这就是gmon.out的最终结果。
我用strace运行我的程序来查看系统调用,并且可以看到它正在跟踪结束时写入gmon输出。