使用gcc -pg -g
编译了一个C ++程序(至少,这些是我在Makefile中给出的参数;没有任何确凿的证据证明执行了什么命令)。程序运行到正常完成,CWD设置为我的主目录。没有写gmon.out文件。
gcc是4.4.7。操作系统是6世纪。
我的程序是由一个手动滚动的Perl守护进程使用fork / exec启动的。我已经验证了CWD是我的主目录,并且它是可写的,通过在执行我的目标程序之前让守护进程执行touch foo
。至于我已经能够研究,这应该不会影响程序的分析或写gmon.out终止(通常)。
答案 0 :(得分:8)
进入同样的问题,在CentOS 7上使用g ++ 4.8.2。-pg
用于编译和链接,运行过程&它正常退出,没有生成gmon.out
。
我通过将_exit(status)
替换为exit(status)
来解决此问题。注意前者是_exit(3),系统调用,后者是exit(2),一种标准的库方法。
为什么这样做?从gprof
手册页:
配置文件程序必须调用"退出"(2)或正常返回,以便将配置文件信息保存在gmon.out文件中。
显然gmon.out的写入依赖于(更高级别)退出(2)。因此,请检查以确保代码使用exit(2)(来自stdlib)而不是_exit(3)(系统调用)。
答案 1 :(得分:1)
也许你几个月前已经解决了,但我今天遇到了这种效果,所以我可以回答未来的访问者:
未显示任何错误消息, gmon.out 刚刚未创建(分析文本文件将为空)。
这可能是因为您没有main
方法或-mwindows
一个WinMain
的原因。例如。如果您使用编译器参数(gcc)-e
或(vc)/entry
或使用__main
。
我查看了gprof手册,但没有找到关于如何告诉它入口点的信息,所以我更改了代码。
答案 2 :(得分:0)
现在已经很晚了,但是对于那些苦苦挣扎的人来说,在使用-pg
编译代码之后,需要运行可执行文件来生成gmon.out