gcov测试代码覆盖率

gcov:GCC Coverage,是一个测试代码覆盖率工具,是命令行方式,伴随GCC发布,配合GCC共同实现对C/C++文件的语句覆盖和分支覆盖测试
与程序概要分析工具(profiling tool,例如gprof)一起工作,可以估计程序中哪一段代码最耗时

gcov可以统计每一行代码的执行频率,实际上哪些代码确实被执行了,每一段代码(section code)的耗时(执行时间),因此,gcov可以帮你优化代码,当然这个优化动作还是应该有开发者完成

一般的流程
*.gcno 最早产生: 编译时产生 ---- *.gcda 中间产生: 运行时产生 ---- *.gcov 最后产生: 运行gcov产生;

  1. gcc编译——>产生目标文件test、gcov的结点文件 test.gcno
test   test.c   test.gcno
  1. 运行目标文件——>生成运行覆盖信息 test.gcda
 ./test
  1. gcov 产生报告信息: test.c.gcov
gcov test.c
  1. lcov:格式化test.c.gcov ,输出到 test.info文件
lcov -d . -t 'test' -o 'test.info' -b . -c

-d: directory
-t “name” :指目标文件,这里 是 test

  1. genhtml:根据信息文件(.info)产生html 文档,输出到一个文件夹中
genhtml -o gcovdir test.info

编译

gcov只支持gcc编译的代码,并且编译时必须有‘-fprofile-arcs -ftest-coverage’参数
高速编译器添加额外的对gcov有用信息以及在目标文件中加入产生profiling信息的代码,当运行这样编译的程序时.
每个以-fprofile-arcs 编译的目标文件所在的目录会生成一个相应的".gcda"文件
每个以-ftest-coverage参数编译时会生成".gcno"文件,它包含了重建基本块图表和指派行号的信

gcc file.c -fprofile-arcs -ftest-coverage -o bubblesort 
编译选项

在编译选项中添加-ftest-coverage -fprofile-arcs,-fkeep-static-functions -fkeep-inline-functions选项可另行选用
在链接选项中添加 -lgcov,特别要注意,编译生成的.so中,也要链接-lgcov,即在生成的可执行程序和.so中,都需要链接-lgcov

修改生成文件*.gcda 路径
  • gcov要求运行时在目标系统中有相同的编译时的绝对目录路径,即生成的.gcda文件在make时的源代码路径相同,为了支持交叉编译,可使用下面两个环境变量重定位数据文件:
  • GCOV PREFIX STRIP - 指示要跳过的目录层次
    • 比如源代码路径为/a/b/c/d.cpp,如果GCOV_PREFIX_STRIP=2, 则实际使用的路径是c/d.cpp
  • GCOV PREFIX - 指定加入到目标文件中的绝对路径前缀,默认没有前缀
    • 如果GCOV_PREFIX=/run/gcov,则.gcda实际存放的路径是/run/gcov/c/d.gcda
  1. 如果程序是**cli(command line interface)**命令行,执行一次得出结果立马退出结束了,那么会直接生成后缀为.gcda的gcov data文件
    如果程序是守护进程,需要常驻后台不能退出,则需要通过信号处理机制来dump出gcov需要的data文件,因此在处理信号的代码中加入如下几行:
extern "C" void __gcov_flush();

switch (signo) {
   ...
case SIGINT:
      // flush out gcov stats data
      __gcov_flush();

运行可执行文件, 生成.gcov文件

经过编译gcc file.c -o file -fprofile-arcs -ftest-coverage后的文件,会生成可执行文件file 和 file.gcno文,然后执行一次可执行文件./ file便会自动生成.gcov文件,打开每个gcov文件,第一列,每个数字,就是所在行的执行次数
注意: gcov必须在编译代码时所在的目录中运行,否则无法定位文件另外,运行计数是累及的,若运行gcov时没删除上次输出的文件,本次测试计数会累加到上次计数上,而不是覆盖。

  1. 生成.gcov文件
./file
  1. 收集运行覆盖信息file.c.gov
gcov file.

来检测的源码运行gcov程序

gcov实例,举例很简单,可帮助理解
结合这个来实际操作一下

gcov可用的选项
gcov程序调用的格式为:
gcov [options] sourcefile
其可用的选项如下:
选项 目的
-v,-version 打印版本信息
-h,-help 打印帮助信息
-a:输出每个基本块的运行计数,此选项可用于统计在同一行中的若干语句的各自运行次数
-p:在.gocv文件名中加入完整的路径信息,此时路径中的’/‘用’#‘表示,’…‘用’^'表示
-b,-branch-probabilities向输出文件输出分支频度
-c,-branch-counts 打印分支计数而不是分支频度
-n,-no-output 不创建gcov输出文件
-l,-long-file-names 创建长文件名
-f,-function-summaries 打印每一个函数的概要
-o,-object-directory .bb,.bbg,.da文件存放的目录

可视化

  1. 为了方便阅读,我们还有工具把这些文件转换成可读性更强的web,这个工具叫做lcov,下载lcov安装完成后运行:
lcov -d ./ -c -o ./output/output.info

这样就会生成一个output.info文件, 使用 lcov --help查看所有

–directory 或者-d 表示的是目录,也就是gcno和gcda目录   
–capture 或者 -c 表示获取覆盖率信息   
–output-file 或者 -o 表示输出文件

  1. 然后使用genhtml命令可以生成可以阅读的web页面:
genhtml -o gcovdir/ output.info

-o选项把生成的web页面指定到gcovdir目录
gcovdir是一个目录,index.html为导航文件,使用 web 浏览器打开 index.html 文件查看代码覆盖结果

生成的web页面如图:在这里插入图片描述

左边每个链接都可以点进去:
在这里插入图片描述

会看到代码和旁边的运行次数:
在这里插入图片描述

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值