代码覆盖率检查是只在一次程序运行过程中,哪些代码和函数被运行到了,哪些没有被运行到,以此来观察是否又无用代码,同时也能观察哪些代码被频繁运行,进而可以进行针对性的优化。
gcov 用来生成报告,lcov用来把 gcov 生成的报告做二次加工成,比如做成 html 网页。
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 -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_EXCL_START 和 // LCOV_EXCL_STOP 把相应的语句和函数包裹起来即可。比如:
- // LCOV_EXCL_START
- void func()
- {
- 1==1;
- }
- // LCOV_EXCL_STOP
如果对这个函数包裹,那么html 结果为:

如果不包裹:
- void func()
- {
- 1==1;
- }
则结果为:

