前言:

代码覆盖率检查是只在一次程序运行过程中,哪些代码和函数被运行到了,哪些没有被运行到,以此来观察是否又无用代码,同时也能观察哪些代码被频繁运行,进而可以进行针对性的优化。

gcov 用来生成报告,lcov用来把 gcov 生成的报告做二次加工成,比如做成 html 网页。

使用gcov生成报告:

2.c:

void func()
{
1==1;
}


int main(int argc,char** agrv)
{
int i = 0;
if (1>2){
i++;
}else{
i--;
}
}

编译:

gcc -fprofile-arcs -ftest-coverage 2.c -o 2

运行:

./2

生成报告:

gcov 2.c

这个时候会得到一个文件  2.c.gcov ,打开文件就可以看到如下结果:

        -:    0:Source:2.c
-: 0:Graph:2.gcno
-: 0:Data:2.gcda
-: 0:Runs:1
-: 0:Programs:1
#####: 1:void func()
-: 2:{
-: 3: 1==1;
#####: 4:}
-: 5:
-: 6:
1: 7:int main(int argc,char** agrv)
-: 8:{
1: 9: int i = 0;
-: 10: if (1>2){
-: 11: i++;
-: 12: }else{
1: 13: i--;
-: 14: }
-: 15:}
-: 16:

此外还会有两个额外的文件 2.gcda  和 2.gcno ,2.gcno 是在编译时生成,2.gcda 是在运行时生成的,暂且不管他们的作用。

使用 lcov 生成汇总报告和 html 网页:

生成报告:

lcov -t "anyNameOfCurrentTest" -o result.info -c -d .

注意,这里的 -t 后跟着本次操作的名称,可以任意取名字,-o 后跟着结果文件名称,-c 表示抓取覆盖数据,-d 后跟着 2.gcda  和 2.gcno 这两个文件的存放路径,这点很重要。

操作完毕后会生成一个文件 result.info

生成 html 网页:

genhtml -o result result.info

这个时候会得到一个文件夹叫做 result,里面有:

├── amber.png
├── emerald.png
├── gc
│ ├── 2.c.func.html
│ ├── 2.c.func-sort-c.html
│ ├── 2.c.gcov.html
│ ├── index.html
│ ├── index-sort-f.html
│ └── index-sort-l.html
├── gcov.css
├── glass.png
├── index.html
├── index-sort-f.html
├── index-sort-l.html
├── ruby.png
├── snow.png
└── updown.png

用浏览器打开 index.html 即可得到汇总结果。

LCOV 例外处理:

有时候某些函数和某些语句就是不会覆盖,然后我们又不想把这些语句和函数纳入统计,作为例外。那么可以使用  // LCOV_EXCL_START  和 // LCOV_EXCL_STOP 把相应的语句和函数包裹起来即可。比如:

// LCOV_EXCL_START
void func()
{
1==1;
}
// LCOV_EXCL_STOP

如果对这个函数包裹,那么html 结果为:

[其他] 代码覆盖率检查 gcov 和 lcov_代码覆盖率

如果不包裹:

void func()
{
1==1;
}

则结果为:

[其他] 代码覆盖率检查 gcov 和 lcov_html_02

[其他] 代码覆盖率检查 gcov 和 lcov_i++_03