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