我有一个带有
-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() ?
如今,Zan Lynx 提出的
__gcov_flush()
已不复存在。
请使用
__gcov_dump()
来代替。