我正在尝试监控我的C ++项目的代码覆盖率。正如我在上一个问题中所说,我需要使用协同程序和其他高级C ++ 2a功能,所以我使用clang++
来编译它。我发现here在使用-coverage
进行编译时可以使用clang++
标记(显然,使用-O0
和-g
)。
与可执行文件一起,这将生成一个.gcno
文件,其中包含可执行文件的映射。运行可执行文件时,会生成一个额外的.gcda
文件,其中包含实际的分析数据。
我注意到如果我多次运行可执行文件,覆盖输出很好地合并到.gcda
文件中,这非常好。
现在,我想知道运行同时多个可执行实例是否安全。
之前有人建议按顺序运行测试:我我按顺序运行它们,但我的应用程序使用了很多网络,而且有些测试需要多个实例才能一起通信(我正在使用Docker)模拟网络,netem
以获得真实的链接方案。)
运行同一个可执行文件的许多实例会导致任何问题吗?我可以想象,如果实现任何锁定机制,覆盖数据将安全地和原子地写入.gcda
文件,如果其他可执行文件需要执行转储,他们将等到锁被释放。但是,我找不到任何保证这实际发生的事情。
答案 0 :(得分:0)
从Clang 7开始,GCOV分析应该是多进程安全的。
在Clang 6中,有两个错误阻止了它的运行,https://bugs.llvm.org/show_bug.cgi?id=34923和https://bugs.llvm.org/show_bug.cgi?id=35464,但现在已修复。
事实上,我们目前正在使用它来收集Firefox(多进程)的覆盖率数据。 Firefox本身都有多个进程,我们还并行运行测试(针对某些特定的测试套件)。