Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 进程终止时如何获取.gcda文件?_C++_G++_Signals_Compiler Optimization - Fatal编程技术网

C++ 进程终止时如何获取.gcda文件?

C++ 进程终止时如何获取.gcda文件?,c++,g++,signals,compiler-optimization,C++,G++,Signals,Compiler Optimization,我有一个包含-fprofile弧和-ftest覆盖范围的二进制构建。二进制文件由进程监视器运行,该监视器将进程作为子进程生成。然后,当我希望进程退出时,我必须通过进程监视器。它向进程发送一个SIGKILL。我发现在这种情况下,.gcda文件不会生成。我能做什么 编辑:实际上,进程监视器首先尝试使进程退出。但是,当用户发出停止进程的命令时,ProcessMonitor库(用于每个进程)调用\u exit,而不是exit。这是所有问题的原因。Afaik编译器(也是IntelC)只在退出处理程序中存储

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

编辑:实际上,进程监视器首先尝试使进程退出。但是,当用户发出停止进程的命令时,ProcessMonitor库(用于每个进程)调用
\u exit
,而不是
exit
。这是所有问题的原因。

Afaik编译器(也是IntelC)只在退出处理程序中存储分析统计数据。 那么,以某种方式告诉流程退出,而不是扼杀它呢? 与添加SIGKILL处理程序类似,其中包含exit()。

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

我看到两种选择:

  • SIGKILL
    以外的捕获信号:任何合理的过程监视器应首先发送
    SIGTERM
    init
    我遇到的批处理管理器就是这样做的
    SIGKILL
    是最后一种手段,因此只能在
    SIGTERM
    之后再发送,然后是宽限期
  • 解决方法:通过一个中间程序运行该程序,该程序将获得
    SIGKILL
    ;让实际的程序定期(或在单独的线程中)检查其父程序是否仍然存在,如果不存在,则让它优雅地退出
  • 这可能会奏效:

    总之:在程序中调用_gcov_flush(),可能在信号处理程序中调用,也可能在执行过程中定期调用

    如果C++代码记得要做一个外部的“C”函数声明,


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

    我可以捕获
    SIGKILL
    ?我以为你抓不到它。只有
    SIGTERM
    。在许多情况下使用SIGKILL是有充分理由的。第一:可靠的软件应该处理它,并且始终使用它可以保证它在最坏的情况下得到测试。第二:KILL关闭时不会花费无用的时间清理内存分配、关闭文件等@Zan Lynx:我编辑了我的帖子,因为你部分是对的。然而,(1)不正确,原因很简单,软件无法通过Unix信号的设计处理SIGKILL。(2) 这不是真的,因为优雅的清理不是无用的。我所说的“处理它”是指软件应该被编写来处理脏关机。这是一种设计理念。请参见此处(2)如果软件是“仅崩溃”的,那么清理任何东西都是浪费时间。@Zan:您的参考资料对事务处理数据库可能的行为提出了有趣的观点,但关键的问题是如何在潜在的终止信号面前进行分析。我确实提供了答案。不确定它是否对nakiya有效。它依赖于GCC库内部。使用
    -ftest coverage
    编译时是否定义了标准的预处理器符号?或者我需要手动指定类似于
    -DUSING\u GCOV
    的内容。感谢您解释链接中的内容,它已经断开了。这里有一个链接指向它的互联网存档版本:@jchl显然不是:(简短的答案似乎是否定的,请参阅链接以获取详细的答案,答案仍然是否定的)