在并行运行中使用gcov进行代码覆盖

时间:2013-02-01 09:52:47

标签: c++ parallel-processing gcov

我使用gcov为项目中的几个文件设置了C / C ++代码覆盖率。 可执行文件正在并行运行。这导致一些共享的代码片段并行运行。

我收到了损坏的.da文件或零大小的.da文件。这是并行运行的问题吗?

因为两个或多个可执行实例试图在同一个.da文件上写入,以便为执行中的每个语句写入覆盖计数?

如果是这样,有没有解决方法?

正在使用的Gcov版本是1.5

2 个答案:

答案 0 :(得分:2)

好吧,你似乎已经找到问题的根本原因并寻找解决方法 我用gcov成功配置了几个代码覆盖项目 我想为你澄清一些事情:

  • 我们在编译期间为每个使用.gcno选项检测的源文件获取--coverage个文件。
  • 在执行时,我们为每个gcno文件获取.gcda个文件。

.gcno文件只是相关源代码文件的流程图结构 .gcda个文件是执行时生成的实际覆盖数据。

因此,在您的情况下.gcda(在早期版本中曾经是.da)当两个或多个执行尝试同时写入相同的.gcda文件时会发生冲突。

最简单的解决方法是连续运行测试。 (至少那就是我所做的)
您无需担心丢失覆盖率数据,因为.gcda在每次执行时都会附加而不会被覆盖。请记住,您不必进行重新编译,因为它会更改.gcno文件,之前的.gcda文件将变得无用。

答案 1 :(得分:0)

我也有类似的需求,我通过设置GCOV_PREFIX环境变量来解决了这个问题。

根据documentation

  

GCOV_PREFIX包含要添加到目标文件中绝对路径的前缀。前缀可以是绝对的,也可以是相对的。默认为无前缀。

GCOV_PREFIX设置为一个自定义目录(对于每个可执行文件+执行都是唯一的),将强制运行时在指定目录中生成' .gcda',而不是使用编译目录(其中' .gcno'是。

所有执行完成后,您将可以使用它们来生成合并运行的报告。