c++ - 多进程覆盖报告
问题描述
我正在尝试监视我的 C++ 项目的代码覆盖率。正如我在上一个问题中所说,我需要使用协程和其他高级 C++2a 功能,所以我使用clang++
它来编译它。我在这里发现,在编译时可以使用该-coverage
标志clang++
(很明显,使用-O0
and -g
)。
与可执行文件一起,这会生成一个.gcno
文件,其中包含可执行文件的映射。运行可执行文件时,会生成一个附加.gcda
文件,其中包含实际的分析数据。
我注意到,如果我多次运行可执行文件,覆盖输出会很好且正确地合并到.gcda
文件中,这非常好。
现在,我想知道同时运行多个可执行文件实例是否安全。
在任何人建议按顺序运行测试之前:我按顺序运行它们,但我的应用程序使用了大量网络,并且一些测试需要多个实例一起通信(我正在使用 Docker 来模拟网络,并netem
得到亲切-不真实的链接场景)。
一起运行同一个可执行文件的多个实例会导致任何问题吗?我可以想象,如果实现了任何锁定机制,覆盖数据将被安全地原子写入.gcda
文件,如果其他可执行文件需要执行转储,它们将等到锁被释放。但是,我找不到任何地方可以保证这确实会发生。
解决方案
自 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 本身中都有多个进程,并且我们还并行运行测试(针对某些特定的测试套件)。
推荐阅读
- reactjs - 如何修复 d3.forceLink 上的“错误:缺失:0”
- javascript - React hooks 警告我缺少依赖项
- php - 对 Instagram 内容的 file_get_contents() 调用响应时间很长(超过 10 秒)
- unity3d - 光线投射点不在平面图层上(奇怪的位置)?
- apache-spark - Spark SQL 嵌套 JSON 错误“输入时没有可行的替代方案”
- email - 如何确保预定的电子邮件无法发送(SendGrid)?
- flutter - 如何使用 Flutter 跳转到移动设置
- python - 在 python 中查找二维列表的索引,其中包含另一个特定的子列表
- jsmodeler - 在 JSModeler 中围绕它们的中心旋转一组对象
- cplex - 计算问题:使用 CPLEX 的对偶值