如何在进程被杀死时获取.gcda文件?

时间:2010-12-08 05:39:55

标签: c++ g++ signals compiler-optimization

我有-fprofile-arcs-ftest-coverage的二进制版本。二进制文件由进程监视器运行,该进程监视器将进程作为子进程生成。然后,当我希望进程退出时,我必须通过进程监视器。它向进程发送SIGKILL。我发现在这种情况下不会生成.gcda个文件。我该怎么办?

编辑:实际上,进程监视器首先尝试使进程退出。但是,当用户发出停止进程的命令时,ProcessMonitor库(在每个进程中使用)调用_exit而不是exit。这是所有麻烦的原因。

3 个答案:

答案 0 :(得分:4)

这可能有用: http://nixcraft.com/coding-general/12544-gcov-g.html

总结:在程序中调用__gcov_flush(),可能在信号处理程序中或在执行期间定期调用。

如果C ++代码记得对函数进行extern“C”声明。

还要记住使用某种预处理器ifdef,以便程序在没有使用性能分析构建时不会调用它。

答案 1 :(得分:3)

SIGKILL是一个“硬”杀死信号,无法被应用程序捕获。因此,应用程序无法写出.gcda文件。

我看到两个选项:

  1. 捕获除SIGKILL以外的信号:任何合理的进程监视器都应首先发送SIGTERMinit和我遇到的批处理管理员都这样做了。 SIGKILL是最后的手段,因此只应在SIGTERM之后发送,然后才会发出宽限期。
  2. 解决方法:通过获取SIGKILL的中间程序运行程序;是否定期(或在单独的线程中)进行实际程序检查,如果其父级仍然存在,如果没有,则让它正常退出。

答案 2 :(得分:0)

Afaik编译器(IntelC也只)在退出处理程序中存储分析统计信息。 那么以某种方式告诉流程退出而不是杀死它呢? 就像添加SIGKILL处理程序一样,可以使用exit()吗?