Table of Contents:

一、gcov简介

gcov是什么

gcov能做什么

使用像gcov或gprof这样的分析器,您可以找到一些基本的性能统计数据:
* 每一行代码执行的频率是多少
* 实际执行了哪些行代码,配合测试用例达到满意的覆盖率和预期工作   
* 每段代码使用了多少计算时间,从而找到热点优化代码   
* gcov创建一个sourcefile.gcov的日志文件,此文件标识源文件sourcefile.c每一行执行的次数,您可以与gprof一起使用这些日志文件来帮助优化程序的性能。gprof提供了您可以使用的时间信息以及从gcov获得的信息。

二、gcov过程概况

主要工作流

三、使用gcov

左图是没有运行可执行文件的gcov文件,右图是运行了可执行文件的gcov文件
* 其中#####表示未运行的行 
* 每行前面的数字表示行运行的次数

四、gcov文件可视化

上述生成的.gcov文件可视化成都较低,需要借助lcovgenhtml工具直接生成html报告。

以下命令执行目录在生成的.o目标文件目录中,执行流程如下:

1.归零所有执行过的产生覆盖率信息的统计文件,即删除所有.gcda文件

lcov -d ./ -z

2.初始化并创建基准数据文件

# -c 捕获,-i初始化,-d应用目录,-o输出文件
lcov -c -i -d ./ -o init.info

3.执行编译后的测试程序,生成.gcda文件

4.收集测试文件运行后产生的覆盖率文件

lcov -c -d ./ -o cover.info

5.合并基准数据和执行测试文件后生成的覆盖率数据

# -a 合并文件
lcov -a init.info -a cover.info -o total.info

6.过滤不需要关注的源文件路径和信息

# --remove 删除统计信息中如下的代码或文件,支持正则
lcov --remove total.info '*/usr/include/*' '*/usr/lib/*' '*/usr/lib64/*' '*/usr/local/include/*' '*/usr/local/lib/*' '*/usr/local/lib64/*' '*/third/*'  -o final.info

7.通过final.info生成html文件

#如果是git目录,可以获取此次版本的commitID,如果不是,忽略此步
# commitId=$(git log | head -n1 | awk '{print $2}')
# 这里可以带上项目名称和提交ID,如果没有,忽略此步
#genhtml -o cover_report --legend --title "${project_name} commit SHA1:${commitId}" --prefix=${curr_path} final.info
# -o 生成的html及相关文件的目录名称,--legend 简单的统计信息说明
# --title 项目名称,--prefix 将要生成的html文件的路径 
genhtml -o cover_report --legend --title "lcov"  --prefix=./ final.info

8.查看覆盖率报告
最终生成的可视化文件在cover_report中,用浏览器打开如下:

覆盖率报告是按目录就行组织的,左侧的路径可以点开,详细看每个文件哪些行被覆盖到了,下面这张图是总的概览

下图是各个文件的列表

下图为具体文件的覆盖率报告

lcov常用的参数

-d 项目路径,即.gcda .gcno所在的路径
-a 合并(归并)多个lcov生成的info文件
-c 捕获,也即收集代码运行后所产生的统计计数信息
--external 捕获其它目录产生的统计计数文件
-i/--initial 初始化所有的覆盖率信息,作为基准数据
-o 生成处理后的文件
-r/--remove 移除不需要关注的覆盖率信息文件
-z 重置所有执行程序所产生的统计信息为0

参考链接