使用gcc -pg -g编译后不会写入gmon.out

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用gcc -pg -g编译后不会写入gmon.out相关的知识,希望对你有一定的参考价值。

使用gcc -pg -g编译了一个C ++程序(至少,这些是我在Makefile中给出的参数;没有任何确凿的证据证明执行了什么命令)。程序运行到正常完成,CWD设置为我的主目录。没有写gmon.out文件。

gcc是4.4.7。 OS是centos 6。

我的程序是由一个手动滚动的Perl守护进程使用fork / exec启动的。我已经验证了CWD是我的主目录,并且它是可写的,让守护进程在执行我的目标程序之前执行touch foo。至于我已经能够研究,这不应该影响程序的分析或写gmon.out终止(通常)。

答案

同样的问题,在CentOS 7上的g ++ 4.8.2.-pg用于编译和链接,运行过程并且它正常退出,没有生成gmon.out

我通过用_exit(status)替换对exit(status)的调用来解决这个问题。注意前者是_exit(3),一个系统调用,后者是exit(2),一个标准的库方法。

为什么这样做?来自gprof手册页:

配置文件程序必须调用“exit”(2)或正常返回,以便将配置文件信息保存在gmon.out文件中。

显然gmon.out的写入依赖于(更高级别)退出(2)。因此,请检查以确保代码使用exit(2)(来自stdlib)而不是_exit(3)(系统调用)。

另一答案

也许你已经在几个月前解决了,但我今天遇到了影响,所以我可以回答未来的访客:

没有显示错误消息,gmon.out只是没有被创建(并且分析文本文件将为空)。

这可能是一个原因是如果你没有main方法或-mwindows WinMain。例如。如果您使用编译器参数(gcc)-e或(vc)/entry或使用__main

我查看了gprof手册,但没有找到有关如何告诉它入口点的信息,所以我更改了代码。

另一答案

这真的很晚了,但是对于那些苦苦挣扎的人来说,在用-pg编译代码之后,你需要运行它的可执行文件来生成gmon.out

以上是关于使用gcc -pg -g编译后不会写入gmon.out的主要内容,如果未能解决你的问题,请参考以下文章