代码覆盖率测试gcov和lcov

  1. 云栖社区>
  2. 博客>
  3. 正文

代码覆盖率测试gcov和lcov

宋好好 2017-10-16 21:33:52 浏览2155
展开阅读全文

gcov是什么?

  • 测试代码覆盖率的工具
  • 命令行方式控制台程序
  • GCC自带,伴随GCC一起发布
  • 可以和gprof一起工作估算代码执行时间

gcov能做什么?

  • 每一行代码的执行效率
  • 哪些代码确实被执行了
  • 每一段代码的耗时

如何使用?

1.编译生成.gcno与.gcda

大部分博客和老的官方manual会告诉你在编译的时候加两个参数 (包括man)-ftest-coverage -fprofile-arcs

但是在g++中会出现(gcc也会出现这种问题)

undefined reference to `__gcov_init'

因为作者在新版本中更改了编译选项,只需要从

 gcc xxx.o -o xxx --coverage
 gcc xxx.o -o xxx -lgcov
 gcc xxx.o -o xxx -fprofile-arcs

选一个就行,我选择的是--coverage, 记得要在编译以及链接的时候加,仅在链接的时候加不会生成相关的文件。编译后会生成.gcno文件,运行后会生成.gcda文件,这些是生成分析文件的源文件

.gcno包含了重建基本块图和相应的块的源码的行号的信息。
.gcda由编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。

2. 生成报告

基本命令

gcov xxx.cc
生成 .cov文件,使用vim打开即可查看

选项


-b 分支覆盖
-a 所有block覆盖
-f 函数覆盖
        -:    0:Source:test.c
        -:    0:Graph:test.gcno
        -:    0:Data:test.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include
        -:    2:
        -:    3:int main (void)
        1:    4:{
        -:    5:    int i, total;
        -:    6:
        1:    7:    total = 0;
        -:    8:
       11:    9:    for (i = 0; i < 10; i++)
        1:    9-block  0
       10:    9-block  1
       11:    9-block  2
       10:   10:        total += i;
        -:   11:
        1:   12:    if (total != 45)
        1:   12-block  0
    #####:   13:        printf ("Failure/n");

代码来源于官方manual
-代表不必执行
数字n代表执行的次数

代表没有被执行过

3.可能的问题

生成文件失败

profiling:Cannot create directory
profiling:Selection.pb.gcda:Skip

Running the program will cause profile output to be generated. For each source file compiled with -fprofile-arcs, an accompanying .gcda file will be placed in the object file directory. That implicitly requires running the program on the same system as it was built or having the same absolute directory structure on the target system. The program will try to create the needed directory structure, if it is not already present.

在运行环境中没有相应的目录,所以不能生成.gcda文件,只要设一下GCOV_PREFIX和GCOV_PREFIX_STRIP环境变量。

GCOV_PREFIX:就是制定生成数据文件的前缀

GCOV_PREFIX_STRIP:就是需要在原来的路径上去掉多少层目录

假设执行路径“/home/a/b/c/d/”,

现在的运行路径是“/home/e/f/g/h/p/l”,那么执行如下命令即可
export GCOV_PREFIX=”/home/e/f/g/h/p/l”
export GCOV_PREFIX_STRIP=4
执行完这两行命令,就可以开始运行被测程序,然后正常退出,就会看到.gcda文件生成出来了。

.gcda文件生成了就可以用lcov直接处理它们,但是在处理的过程中遇到以下错误:

文件时间戳不一致

“stamp mismatch with graph file”
Processing Ads_Request.gcda
xxx.gcda:stamp mismatch with graph file
geninfo: WARNING: gcov did not create any files for xxx.gcda!

导致出现这个错误的原因是.gcda和.gcno文件并不是同一次build出来的,它们2个文件的时间戳就不一样,更新所有的.gcno文件即可。

Using gcov with GCC Optimization

https://gcc.gnu.org/onlinedocs/gcc/Gcov-and-Optimization.html#Gcov-and-Optimization

4.缺陷

gcov的每个源码的分析分散在对应的 .cov 文件中,
如果有N个源文件,基本上就很难快速分析处理了,最关键的是文本,也没有图表什么的

lcov

lcov是什么

  • 是GCOV图形化的前端工具
  • 是Linux Test Project维护的开放源代码工具,最初被设计用来支持Linux内核覆盖率的度量
  • 基于Html输出,并生成一棵完整的HTML树
  • 输出包括概述、覆盖率百分比、图表,能快速浏览覆盖率数据
  • 支持大项目,提供三个级别的视图:目录视图、文件视图、源码视图

安装

    sudo yun install lcov

使用lcov

lcov -t "xxx" -o xxx.info -c -d filepath
-t sets a test name
-o to specify the output file
-c to capture the coverage data
-d to specify the directory where the data files needs to be searched

生成前端显示
genhtml -o res xxx.info

res :生成的文件名
xxx.info : 上一步生成的信息文件

之后打开res下的index.html就可以浏览了

Reference

gcov—a Test Coverage Program

USING GCOV AND LCOV TO GENERATE BEAUTIFUL C++ CODE COVERAGE STATISTICS

C++ code coverage profiling with GCC/GCOV

网友评论

登录后评论
0/500
评论
宋好好
+ 关注