gcov代码覆盖率测试

gcov代码覆盖率测试

gcov的简单介绍

1.gcov是一个测试代码覆盖率的工具。与GCC一起使用来分析程序,以帮助创建更高效、更快的运行代码,并发现程序的未测试部分
2.是一个命令行方式的控制台程序。需要结合lcov,gcovr等前端图形工具才能实现统计数据图形化
3.伴随GCC发布,不需要单独下载gcov工具。配合GCC共同实现对c/c++文件的语句覆盖和分支覆盖测试
4.与程序概要分析工具(profiling tool,例如gprof)一起工作,可以估计程序中哪段代码最耗时

gcov能做什么

使用像gcov或gprof这样的分析器,您可以找到一些基本的性能统计数据:

  • 每一行代码执行的频率是多少
  • 实际执行了哪些行代码,配合测试用例达到满意的覆盖率和预期工作
  • 每段代码使用了多少计算时间,从而找到热点优化代码
  • gcov创建一个sourcefile.gcov的日志文件,此文件标识源文件sourcefile.c每一行执行的次数,您可以与gprof一起使用这些日志文件来帮助优化程序的性能。gprof提供了您可以使用的时间信息以及从gcov获得的信息。

注意事项

1.通过将一些代码行合并到一个函数中,可能不会提供足够的信息来查找代码使用大量计算机时间的“热点”。同样地,由于gcov按行(在最低的分辨率下)积累统计数据,它最适合于只在每行上放置一个语句的编程风格。如果您使用扩展到循环或其他控制结构的复杂宏,那么统计信息就没有那么有用了——它们只报告出现宏调用的行。如果您的复杂宏的行为类似于函数,那么您可以用inline fu替换它们。
2.gcov只在使用GCC编译的代码上工作。它与任何其他概要或测试覆盖机制不兼容。

使用gcov的3个阶段

1.编译阶段

要开启gcov功能,需要在源码编译参数中加入-fprofile-arcs -ftest-coverage

  • -ftest-coverage:在编译的时候产生.gcno文件,它包含了重建基本块图和相应的块的源码的行号的信息。
  • -fprofile-arcs:在运行编译过的程序的时候,会产生.gcda文件,它包含了弧跳变的次数等信息。

以下我们以test.c这个程序为例子,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int main()
{
int n=4;
int i=0;
for(i=0;i<n;i++)
{
printf("Hello World!\n");
}
int a =20220118;
printf("%d\n",a);
return 0;
}

编译阶段:

2. gcov收集代码运行信息

  • 运行./test产生test.gcda文件,其中包含了代码基本块和狐跳变次数统计信息

3. 生成gcov代码覆盖率报告

  • 再次运行gcov test.c产生的test.c.gcov中包含了代码覆盖率数据,其数据的来源为test.gcda

4.查看生成gcov代码覆盖率报告

可以看到以下结果:

  • 其中#####表示未运行的行
  • 每行前面的数字表示行运行的次数
  • —代表不必执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-:    0:Source:test.c
-: 0:Graph:test.gcno
-: 0:Data:test.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:#include<stdio.h>
1: 2:int main()
-: 3:{
1: 4: int n=4;
1: 5: int i=0;
5: 6: for(i=0;i<n;i++)
-: 7: {
4: 8: printf("Hello World!\n");
-: 9: }
1: 10: int a =20220118;
1: 11: printf("%d\n",a);
1: 12: return 0;
-: 13:}

配合lcov使用,图形化显示

1.centos安装lcov:

1
yum install lcov

2.运行lcov,生成相应信息

运行结果:

3.生成web可视化信息

运行结果:

4.打包result文件

5.从服务器下载到本地

6.查看web

​ 1)查看index.html:

​ 2)详细信息:

上述界面包含:

  • 函数覆盖率(执行率)
  • 代码行数覆盖率(执行率)
  • 语句执行次数
  • 源码级的详细信息

参考资料

(6条消息) gcov代码覆盖率测试-原理和实践总结_yanxiangyfg的专栏-CSDN博客_gcov代码覆盖率-gcov代码覆盖率测试-原理和实践总结

(6条消息) 代码覆盖率测试工具:gcov和lcov的使用_ARM-Linux-CSDN博客-代码覆盖率测试工具:gcov和lcov的使用

linux文件夹打包命令 - 小作一个 - 博客园 (cnblogs.com)-Linux文件打包命令

如何使用gcov和perf工具抓热点代码 - 陈小欧 - 20210331 - PLCT实验室_哔哩哔哩_bilibili-如何使用gcov和perf工具抓热点代码 - 陈小欧 - 20210331 - PLCT实验室