我已经为项目中的几个文件设置了C/C++代码覆盖率,使用gcov进行覆盖率测试。
可执行文件正在并行运行。这导致一些共享代码被并行运行。
我得到了损坏的.da文件或大小为零的.da文件。这是并行运行时的问题吗?
因为两个或多个可执行实例都试图在同一个.da文件上写入覆盖率计数,以记录每个执行语句的覆盖率计数?
如果是这样的话,是否有任何解决方法?
使用的Gcov版本为1.5。
我已经为项目中的几个文件设置了C/C++代码覆盖率,使用gcov进行覆盖率测试。
可执行文件正在并行运行。这导致一些共享代码被并行运行。
我得到了损坏的.da文件或大小为零的.da文件。这是并行运行时的问题吗?
因为两个或多个可执行实例都试图在同一个.da文件上写入覆盖率计数,以记录每个执行语句的覆盖率计数?
如果是这样的话,是否有任何解决方法?
使用的Gcov版本为1.5。
我曾有类似的需求,通过设置GCOV_PREFIX
环境变量来解决。
根据文档:
GCOV_PREFIX 包含要添加到目标文件中绝对路径的前缀。前缀可以是绝对的或相对的。默认情况下没有前缀。
将GCOV_PREFIX
设置为每个可执行文件+执行唯一的自定义目录将强制运行时在指定目录中生成 ".gcda" ,而不是使用编译目录(其中 '.gcno' 位于)。
完成所有执行后,您将能够使用它们来生成合并运行报告。
GCOV_PREFIX_STRIP
和 GCOV_PREFIX
使我能够将每个测试的 .gcda
文件放置在单独的目录中。现在我只需要想办法如何将它们组合起来。然后我就可以并行运行所有的测试了。 - thoni56.gcno
和生成的.gcda
放在一起。与其将.gcda
复制到对象和.gcno
所在的位置,我将.gcno
复制到.gcda
目录中。通过这种方式,我可以为每个测试单独创建覆盖信息。我还可以使用lcov -o total.coverage -a <coverage1> -a <coverage2> ...
组合所有信息。 - thoni56看起来您已经找到了问题的根本原因并正在寻找解决方法。
我已经成功地为一些使用gcov的项目配置了代码覆盖率。
以下是我想向您澄清的几点:
--coverage
选项插装的源文件都会生成一个.gcno
文件。.gcda
文件。.gcno
文件只是相关源代码文件的流程图结构。
.gcda
文件是在执行时生成的实际覆盖数据。
因此,在您的情况下,当两个或多个执行尝试同时写入同一个.gcda
文件时,就会产生冲突。
最简单的解决方法是串行运行测试(至少这是我所做的)。
您不需要担心丢失覆盖数据,因为.gcda
文件会随着每次执行而追加,而不是覆盖。请记住,您不需要重新编译,因为这会改变.gcno
文件,之前的.gcda
文件将变得无用。
clang
)不起作用。 - yugr -fprofile-dir
中的%p
模式。-fprofile-dir=coverage.%p
GCOV_PREFIX
环境变量。它还可以实现更复杂的用例分析,例如递归运行相同的程序/库(如clang
和gcc
)。
收集覆盖率后,您可以使用gcov-tool-many进行合并(它是gcov-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