【问题标题】:gmon.out is not written after compiling with gcc -pg -g使用 gcc -pg -g 编译后不写 gmon.out
【发布时间】:2013-09-27 04:59:24
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ linux gcc gprof


【解决方案1】:

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

【讨论】:

  • 谢谢!我遇到了完全相同的问题。
  • 我有一个类似的问题,我有一个程序在无限循环中运行,我用ctrl+c 手动终止它。删除循环的无限部分,以便程序正常终止为我修复它。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    出现这种情况的一个原因是如果您没有main 方法,或者在-mwindows 的情况下是WinMain。例如。如果您使用编译器参数 (gcc) -e 或 (vc) /entry 或使用 __main

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

    【讨论】:

      猜你喜欢
      • 2013-11-18
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      相关资源
      最近更新 更多