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