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

前言:

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

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 结果为:

如果不包裹:

void func()
{
   1==1;
}

则结果为:

[其他] 代码覆盖率检查 gcov 和 lcov_第1张图片

 

 

你可能感兴趣的:(其他,代码覆盖率)