[其他] 代码覆盖率检查 gcov 和 lcov
原创
©著作权归作者所有:来自51CTO博客作者obentul的原创作品,请联系作者获取转载授权,否则将追究法律责任
前言:
代码覆盖率检查是只在一次程序运行过程中,哪些代码和函数被运行到了,哪些没有被运行到,以此来观察是否又无用代码,同时也能观察哪些代码被频繁运行,进而可以进行针对性的优化。
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.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 结果为:
如果不包裹:
则结果为: