gcov是伴随gcc一起发布的代码覆盖率统计的工具,不需要单独安装,一般配合其图形化工具lcov一起使用。
下面以a.c文件的编译运行来统计代码覆盖率来介绍gcov和lcov的使用:(lcov自行安装)
#include <stdio.h>
int add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int ret = add(4, 5);
printf("ret ==> %d
", ret);
return 0;
}
编译 : gcc –o a a.c -fprofile-arcs -ftest-coverage –lgcov
编译完成后会生成a.gcno文件
运行: ./a
运行完成后会生成a.gcda文件
覆盖率报告的生成:
lcov -c -d ./ -o coverage.info # -d 指定编译的目录,进行.gcno和.gcda文件的扫描,生成coverage.info文件 genhtml -o report coverage.info # 利用lcov生成的coverage.info文件形成html可视化的覆盖率报告
命令执行完成后会生成report目录,双击index.html即可在浏览器中查看覆盖率信息。
相关说明:
- 编译阶段会生成.gcno文件,.gcno文件是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。
- 运行阶段会产生.gcda文件,.gcda文件是由-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息,而gcda只能在程序运行完毕后才能产生。
- 由于编译阶段依赖gcov库,所以要加上-lgcov选项。
- 如果编译环境和运行环境相同, .gcno文件和.gcda文件会生成于同名.c文件所在的目录。比如 a.c位于/home/workspace/目录之下,那么生成的.gcno和.gcda也位于/home/workspace/目录之下。
- 如果编译环境和运行环境不同,会在运行环境中生成和编译环境相同的目录结构来存放.gcda文件。比如编译环境中.gcno所在目录为/home/workspace/,那么在运行环境中也会产生一个/home/workspace/目录用于存放.gcda文件,这时如果想要生成覆盖率报告,需要先将.gcda文件拷贝到编译环境中与其同名的.gcno文件所在目录,使gcno与gcda文件一一对应,然后再进行覆盖率报告的生成。