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

问题描述 投票:0回答:4

我有一个带有

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

编辑:实际上进程监视器首先尝试使进程退出。但是,当用户发出停止进程的命令时,ProcessMonitor 库(在每个进程中使用)调用

_exit
而不是
exit
。这是一切麻烦的根源。

c++ g++ signals compiler-optimization
4个回答
4
投票

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

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

如果是 C++ 代码,请记住对函数进行 extern“C” 声明。

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


3
投票

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

我看到两个选项:

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

0
投票

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


0
投票

如今,Zan Lynx 提出的

__gcov_flush()
已不复存在。

请使用

__gcov_dump()
来代替。

© www.soinside.com 2019 - 2024. All rights reserved.