如何与运行 lcov程序同时生成代码覆盖率

How to generate code coverage with running lcov program at the same time

我有一个大型项目,在其他机器上有 unittest 二进制文件 运行ning。因此,gcda 文件是在其他机器上生成的。然后,我将它们下载到本地机器,但目录不同。每个目录都有源代码。

例如:dir gcda1/src/{*.gcda, *.gcno, *.h, *.cpp}..., dir gcda2/src/{*.gcda, *.gcno, *.h, *.cpp}....

因为项目很大,所以不得不运行多个lcov进程同时生成info文件来节省时间。然后合并这些信息文件。

问题是,当我合并这些信息文件时,它会使用目录信息,例如:

gcda1/src/unittest1.cpp
gcda2/src/unittest1.cpp

我想要这个:

src/unittest1.cpp
#src/unittest1.cpp # this is expected to merge with above

我使用的指令:

$ cd gcda1
$ lcov --rc lcov_branch_coverage=1 -c -d ./ -b ./ --no-external -o gcda1.info
$ cd ../gcda2
$ lcov --rc lcov_branch_coverage=1 -c -d ./ -b ./ --no-external -o gcda2.info
$ cd ..
$ lcov -a gcda1/gcda1.info -a gcda1/gcda2.info -o gcda.info
$ genhtml gcda.info -o output

根目录包含源代码。

描述

嗯,我终于找到了解决这个问题的方法。

生成的信息文件lcov是纯文本文件。所以我们可以直接编辑它们。

打开这些文件后,您会看到每个文件行都以 SF 开头。如下所示:

SF:/path/to/your/source/code.h
SF:/path/to/your/source/code.cpp
...

问题

在我的问题中,这些将是:

// file gcda1.info
SF:/path/to/root_dir/gcda1/src/unittest1.cpp
// file gcda2.info
SF:/path/to/root_dir/gcda2/src/unittest1.cpp

并且,在 lcov 合并之后,它将是:

// file gcda.info
SF:/path/to/root_dir/gcda1/src/unittest1.cpp
SF:/path/to/root_dir/gcda2/src/unittest1.cpp

但是,我希望这样:

// file gcda.info
SF:/path/to/root_dir/src/unittest1.cpp

方法

我解决问题的方法是直接编辑信息文件。

首先,编辑gcda1.infogcda2.info,将/path/to/root_dir/gcda1/src/unittest1.cpp更改为/path/to/root_dir/src/unittest1.cpp,将/path/to/root_dir/gcda2/src/unittest1.cpp更改为/path/to/root_dir/src/unittest1.cpp

然后像下面那样合并它们并生成html报告:

$ lcov -a gcda1.info -a gcda2.info -o gcda.info
$ genhtml gcda.info -o output

在大型项目中,我们不能手动编辑每个信息文件,否则你会崩溃。

我们可以使用sed来帮助我们。如下所示:

$ sed "s/\(^SF.*\/\)gcda[0-9]+\/\(.*\)//g" gcda_tmp.info > gcda.info