使用gcov和lcov进行覆盖率统计

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\n", 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文件一一对应,然后再进行覆盖率报告的生成。

猜你喜欢

转载自www.cnblogs.com/tongyishu/p/12721089.html
今日推荐