使用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的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenMP 4.0 (gcc 4.8.4) 而不是 OpenMP 3.1 (gcc 4.9.2) 时速度会降低

如何使用安装在 macports 中的 gcc?

使用 clang 而不是 gcc 安装犰狳

使用 gcc 链接 Apple 框架

使用比平台提供的更新版本的 GCC 需要啥

使用 GCC (ARM) 配置 FreeRTOS