linux 在用gcc -pg -g编译之后,gmon.out没有被写入

368yc8dk  于 2023-01-12  发布在  Linux
关注(0)|答案(4)|浏览(279)

使用gcc -pg -g编译了一个C++程序(至少,这些是我在Makefile中给出的参数;我没有任何确凿的证据证明执行了什么命令)。程序运行正常完成,CWD设置为我的主目录。没有gmon.out文件写入。
gcc是4.4.7操作系统是centos 6。
我的程序是由一个手工滚动的Perl守护进程使用fork/exec启动的。我已经验证了CWD是我的主目录,并且它是可写的,方法是让守护进程在执行我的目标程序之前执行touch foo。就我所能研究的而言,这不应该影响程序在终止时(正常情况下)的分析或编写gmon.out。

oxiaedzo

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)(系统调用)。

hsvhsicv

hsvhsicv2#

现在已经很晚了,但是对于那些正在努力的人来说,在使用-pg编译代码之后,需要运行可执行文件以生成gmon.out

kuhbmx9i

kuhbmx9i3#

也许你已经解决了这个问题几个月前,但我今天遇到的影响,所以我可以回答未来的游客:
没有显示错误消息,gmon.out没有创建(分析文本文件将为空)。
原因之一可能是你没有main方法或者在-mwindows的情况下是WinMain。例如,如果你使用编译器参数(gcc)-e或(vc)/entry或者使用__main
我看了GPROF手册,但没有找到有关如何告诉它一个入口点的信息,所以我更改了代码。

izj3ouym

izj3ouym4#

在我的例子中,问题是可执行文件被chdir'ing(改变当前工作目录)到其他地方,而这就是gmon.out的最终结果。
我用strace运行我的程序来查看系统调用,并且可以看到它正在跟踪结束时写入gmon输出。

相关问题