代码覆盖率测试gcov和lcov

简介:

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

目录
相关文章
|
JavaScript 前端开发 开发者
VUE 开发——Node.js学习(一)
VUE 开发——Node.js学习(一)
347 2
|
存储
「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器
本篇将带你实现一个颜色选择器应用。用户可以从预设颜色中选择,或者通过输入颜色代码自定义颜色来动态更改界面背景。该应用展示了如何结合用户输入、状态管理和界面动态更新的功能。
494 3
「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
jenkins Java 持续交付
Jenkins - 默认用户名和密码及启动方法
Jenkins - 默认用户名和密码及启动方法
8614 0
|
存储 前端开发 安全
JavaScript进阶 - 浏览器存储:localStorage, sessionStorage, cookies
【7月更文挑战第2天】探索Web存储:localStorage持久化,sessionStorage会话限定,cookies则伴随HTTP请求。了解它们的特性和限制,如localStorage的5MB容量限制、跨域问题,sessionStorage的生命周期,及cookies的安全与带宽消耗。使用时需权衡安全、效率与应用场景。示例代码展示存储与检索方法。
1257 2
|
存储 NoSQL Redis
如何修改docker默认数据目录
【7月更文挑战14天】
1206 3
|
前端开发
Clion注释缩进设置
Clion注释缩进设置
546 2
|
JSON 数据格式
关于nlohmann::json的简单使用
关于nlohmann::json的简单使用
836 0
关于nlohmann::json的简单使用