我使用gcov为项目中的几个文件设置了C / C ++代码覆盖率。 可执行文件正在并行运行。这导致一些共享的代码片段并行运行。
我收到了损坏的.da文件或零大小的.da文件。这是并行运行的问题吗?
因为两个或多个可执行实例试图在同一个.da文件上写入,以便为执行中的每个语句写入覆盖计数?
如果是这样,有没有解决方法?
正在使用的Gcov版本是1.5
答案 0 :(得分:2)
好吧,你似乎已经找到问题的根本原因并寻找解决方法 我用gcov成功配置了几个代码覆盖项目 我想为你澄清一些事情:
.gcno
选项检测的源文件获取--coverage
个文件。.gcda
个文件。 .gcno
文件只是相关源代码文件的流程图结构
.gcda
个文件是执行时生成的实际覆盖数据。
因此,在您的情况下.gcda
(在早期版本中曾经是.da
)当两个或多个执行尝试同时写入相同的.gcda
文件时会发生冲突。
最简单的解决方法是连续运行测试。 (至少那就是我所做的)
您无需担心丢失覆盖率数据,因为.gcda
在每次执行时都会附加而不会被覆盖。请记住,您不必进行重新编译,因为它会更改.gcno
文件,之前的.gcda
文件将变得无用。
答案 1 :(得分:0)
我也有类似的需求,我通过设置GCOV_PREFIX
环境变量来解决了这个问题。
GCOV_PREFIX包含要添加到目标文件中绝对路径的前缀。前缀可以是绝对的,也可以是相对的。默认为无前缀。
将GCOV_PREFIX
设置为一个自定义目录(对于每个可执行文件+执行都是唯一的),将强制运行时在指定目录中生成' .gcda',而不是使用编译目录(其中' .gcno'是。
所有执行完成后,您将可以使用它们来生成合并运行的报告。