gcov代码覆盖率测试-原理和实践总结

最近学习makefile,发现gcov这个功能挺好用,在此做总结。

首先感谢https://blog.csdn.net/yanxiangyfg/article/details/80989680

https://blog.csdn.net/heli007/article/details/8268614 的教程

 

一.gcov简介

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

gcov能做什么

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

二、gcov过程概况

<主要工作流>

  • 1) 编译前,在编译器中加入编译器参数-fprofile-arcs -ftest-coverage
  • 2) 源码经过编译预处理,然后编译成汇编文件,在生成汇编文件的同时完成插桩。插桩是在生成汇编文件的阶段完成的,因此插桩是汇编时候的插桩,每个桩点插入3~4条汇编语句,直接插入生成的*.s文件中,最后汇编文件汇编生成目标文件,生成可执行文件;并且生成关联BB和ARC的.gcno文件;
  • 3) 执行可执行文件,在运行过程中之前插入桩点负责收集程序的执行信息。所谓桩点,其实就是一个变量,内存中的一个格子,对应的代码执行一次,则其值增加一次;
  • 4) 生成.gcda文件,其中有BB和ARC的执行统计次数等,由此经过加工可得到覆盖率。

三、使用gcov的3个阶段

1. 编译阶段

要开启gcov功能,需要在源码编译参数中加入-fprofile-arcs -ftest-coverage
* -ftest-coverage:在编译的时候产生.gcno文件,它包含了重建基本块图和相应的块的源码的行号的信息。
* -fprofile-arcs:在运行编译过的程序的时候,会产生.gcda文件,它包含了弧跳变的次数等信息。

直接工程举例说明吧。

下面是主函数代码:

#include 
#include 


void hello()
{
    printf("hello world\r\n");

}
void hello1()
{
    printf("hello world1\r\n");

}
void hello2()
{
    printf("hello world2\r\n");

}
int main(int argc, char *argv[])
{   
    for (int i =0; i<10;i++)
    {
        printf("here\r\n");
    }
    if (argc >=2) {
        printf("=====argc>=2\n");
        hello1();
        return 0;
    }
    printf("helloworld begin\n");

    if (argc <2){
        printf("=====argc<2\n");
        hello();
        return 0;
    }
    return 0;
}

下面是makefile代码

CFLAGS+= -fprofile-arcs -ftest-coverage

CC=gcc

target=main

.PHONE: all
all: $(target)

$(target): test.o
	${CC} ${CFLAGS} $^ -o $@

%.o : %.c
	$(CC) -g -c $^ -o $@  $(CFLAGS)

.PHONY: get
get : 
	gcov *.c

.PHONY: html
html :
	lcov -c -d . -o $(target).info
	genhtml -o result $(target).info 

.PHONY: clean

clean :
	rm -rf *.o *.info
	rm -rf $(target)
	rm -rf  *.gcov *.gcda *.gcno


2.代码运行

运行make 即可生成test.gcno 和main 执行文件,每次执行main二进制文件都会把结果记录到 test.gcda 里面。

gcov代码覆盖率测试-原理和实践总结_第1张图片

3.执行在命令行里面执行 gcov test.c或者make get,即可生成gcov代码覆盖率报告,其中包含了代码基本块和狐跳变次数统计信息

gcov代码覆盖率测试-原理和实践总结_第2张图片

4.执行cat test.c.gcov即可看到统计信息

gcov代码覆盖率测试-原理和实践总结_第3张图片

然后执行make  html即可生成网页报告

gcov代码覆盖率测试-原理和实践总结_第4张图片

打开result 文件夹html网页,即可看到当前网页报告

gcov代码覆盖率测试-原理和实践总结_第5张图片

参考源码地址:https://github.com/donny681/gcove_dmo

总结

为什么要用这个gcov这个工具呢,方便我们自己检查代码,查看工程中有没有多余不用变量或者函数,或者审核代码有没有多余函数。

你可能感兴趣的:(makefile)