我有一个带有-fprofile-arcs
和的二进制构建-ftest-coverage
。该二进制文件由进程监视器运行,该进程监视器将该进程作为子进程生成。然后,当我希望进程退出时,我必须通过进程监视器。它向SIGKILL
进程发送一个。我发现.gcda
在这种情况下不会生成文件。我能做些什么?
编辑:实际上进程监视器首先尝试使进程退出。但是,ProcessMonitor 库(在每个进程中使用)调用_exit
而不是exit
在用户发出命令停止进程时调用。这是一切麻烦的根源。
我有一个带有-fprofile-arcs
和的二进制构建-ftest-coverage
。该二进制文件由进程监视器运行,该进程监视器将该进程作为子进程生成。然后,当我希望进程退出时,我必须通过进程监视器。它向SIGKILL
进程发送一个。我发现.gcda
在这种情况下不会生成文件。我能做些什么?
编辑:实际上进程监视器首先尝试使进程退出。但是,ProcessMonitor 库(在每个进程中使用)调用_exit
而不是exit
在用户发出命令停止进程时调用。这是一切麻烦的根源。
这可能有效:http: //nixcraft.com/coding-general/12544-gcov-g.html
总之:在程序中调用 __gcov_flush() ,可能在信号处理程序中或在执行期间定期调用。
如果 C++ 代码记得对函数进行 extern "C" 声明。
还要记住使用某种预处理器 ifdef 以便程序在不使用分析构建时不会调用它。
SIGKILL
是一个“硬”终止信号,无法被应用程序捕获。因此,应用程序没有机会写出.gcda
文件。
我看到两个选项:
SIGKILL
:任何明智的进程监视器都应SIGTERM
首先发送。init
我遇到的批处理管理器就是这样做的。SIGKILL
是不得已而为之,因此只能在SIGTERM
宽限期后发送。SIGKILL
解决方法:通过获取;的中间程序运行程序 让实际程序定期(或在单独的线程中)检查它的父级是否仍然存在,如果没有,让它优雅地退出。Afaik 编译器(IntelC 也是)仅将分析统计信息存储在退出处理程序中。那么以某种方式告诉进程退出而不是杀死它呢?就像添加一个 SIGKILL 处理程序一样,其中包含 exit() ?