10

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

gcc 是 4.4.7。操作系统是centos 6。

我的程序是由使用 fork/exec 的手动 Perl 守护程序启动的。我已经验证了 CWD 是我的主目录,并且它是可写的,方法是让守护程序在执行touch foo我的目标程序之前执行。据我所知,这不应该影响程序的分析或 gmon.out 终止时(通常)的编写。

4

3 回答 3

15

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

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

为什么这行得通?从gprof手册页:

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

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

于 2015-01-02T20:09:52.513 回答
2

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

于 2017-12-10T22:46:44.057 回答
1

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

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

可能出现这种情况的一个原因是,如果您没有main方法或在. 例如,如果您使用编译器参数 (gcc)或 (vc)或使用.-mwindowsWinMain-e/entry__main

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

于 2014-04-18T19:19:22.320 回答