如何与运行 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.info
和gcda2.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
我有一个大型项目,在其他机器上有 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.info
和gcda2.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