c++ - 多进程覆盖率报告

标签 c++ code-coverage clang++ llvm-cov

我正在尝试监视我的 C++ 项目的代码覆盖率。正如我在上一个问题中所述,我需要使用协程和其他高级 C++2a 功能,因此我使用 clang++ 来编译它。我发现here使用 clang++ 编译时可以使用 -coverage 标志(显然,还有 -O0-g >).

与可执行文件一起,这会生成一个 .gcno 文件,其中包含可执行文件的映射。运行可执行文件时,会生成一个附加的 .gcda 文件,其中包含实际的分析数据。

我注意到,如果我多次运行可执行文件,覆盖率输出会很好地正确地合并到 .gcda 文件中,这非常好。

现在,我想知道同时运行可执行文件的多个实例是否安全。

在有人建议按顺序运行测试之前:我正在按顺序运行它们,但我的应用程序使用大量网络,并且某些测试需要多个实例一起通信(我正在使用 Docker来模拟网络,netem 来获得真实的链接场景)。

同时运行同一可执行文件的多个实例会导致任何问题吗?我可以想象,如果实现了任何锁定机制,覆盖率数据将被安全且原子地写入 .gcda 文件,并且如果其他可执行文件需要执行转储,它们将等待直到锁定释放。但是,我找不到任何地方可以保证这确实会发生。

最佳答案

从 Clang 7 开始,GCOV 分析应该是多进程安全的。

在 Clang 6 中,有两个错误阻止其工作,https://bugs.llvm.org/show_bug.cgi?id=34923https://bugs.llvm.org/show_bug.cgi?id=35464 ,但它们现在已修复。

事实上,我们目前正在使用它来收集多进程 Firefox 的覆盖率数据。我们在 Firefox 本身中都有多个进程,并且我们还并行运行测试(针对某些特定的测试套件)。

关于c++ - 多进程覆盖率报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50632199/

相关文章:

c++ - 用于打开程序的 Makefile

c++ - 烦人的错误消息 : cannot merge previous GCDA file

java - 我的 gradle 多项目 + java + groovy + clover + sonarqube 无法在 Sonar 中达到 100% 代码覆盖率

ruby - 每次在 ruby​​ 中执行文件时,有没有办法增加一个数字

c++ - 简单的 std::regex_search() 代码无法使用 Apple clang++ -std=c++14 编译

c++ - vs 2013 C++ 的 opencv 问题

c++ - c++变量名中的北欧字符?

c++ - g++,基于范围和向量化

c++ - QT 的 AfxGetApp()->m_lpCmdLine?

c++ - 在多态对象上使用 typeid 时,必须定义它吗?