多流程覆盖率报告

时间:2018-05-31 20:20:51

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

我正在尝试监控我的C ++项目的代码覆盖率。正如我在上一个问题中所说,我需要使用协同程序和其他高级C ++ 2a功能,所以我使用clang++来编译它。我发现here在使用-coverage进行编译时可以使用clang++标记(显然,使用-O0-g)。

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

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

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

之前有人建议按顺序运行测试:我按顺序运行它们,但我的应用程序使用了很多网络,而且有些测试需要多个实例才能一起通信(我正在使用Docker)模拟网络,netem以获得真实的链接方案。)

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

1 个答案:

答案 0 :(得分:0)

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

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

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