9

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

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

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

如果是这样,是否有任何解决方法?

正在使用的 Gcov 版本是 1.5

4

3 回答 3

5

我有类似的需求,我通过设置GCOV_PREFIX环境变量来解决它。

根据文档

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

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

一旦所有执行完成,您就可以使用它们来生成合并运行报告。

于 2019-06-20T08:34:56.520 回答
3

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

  • 我们在编译期间.gcno为每个带有--coverage选项的源文件获取文件。
  • 并且在执行时,我们会.gcda为每个 gcno 文件获取文件。

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

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

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

于 2017-03-10T08:29:32.423 回答
1

较新(9+)版本的 GCC 支持模式的另一个解决方案%p-fprofile-dir

-fprofile-dir=coverage.%p

这允许人们避免GCOV_PREFIX每次都显式地重新生成环境变量。它还可以分析更复杂的用例,例如递归地运行相同的程序/库(clang就像gcc这样)。

收集覆盖范围后,您可以在gcov-tool-manygcov-tool的帮助下将其组合起来(这是一个一次只能组合两个配置文件的包装器):

# Combine coverages
$ scripts/gcov-tool-many merge coverage.*
# Get rid of mangled names like #home#user#myproject#bin#main.gcda
for f in `find -name '#*.gc[dn][ao]'`; do
  mv $f $(basename $f | tr \# /)
done
# Generate the report
gcov *.gcno
于 2022-01-03T13:23:46.700 回答