4

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

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

4

3 回答 3

4

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

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

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

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

于 2010-12-08T20:33:20.443 回答
3

SIGKILL是一个“硬”终止信号,无法被应用程序捕获。因此,应用程序没有机会写出.gcda文件。

我看到两个选项:

  1. 捕获除 : 以外的信号SIGKILL:任何明智的进程监视器都应SIGTERM首先发送。init我遇到的批处理管理器就是这样做的。SIGKILL是不得已而为之,因此只能在SIGTERM宽限期后发送。
  2. SIGKILL解决方法:通过获取;的中间程序运行程序 让实际程序定期(或在单独的线程中)检查它的父级是否仍然存在,如果没有,让它优雅地退出。
于 2010-12-08T12:31:41.993 回答
0

Afaik 编译器(IntelC 也是)仅将分析统计信息存储在退出处理程序中。那么以某种方式告诉进程退出而不是杀死它呢?就像添加一个 SIGKILL 处理程序一样,其中包含 exit() ?

于 2010-12-08T07:49:12.990 回答