最近学习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 <stdio.h>
#include <string.h>
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 里面。
3.执行在命令行里面执行 gcov test.c或者make get,即可生成gcov代码覆盖率报告,其中包含了代码基本块和狐跳变次数统计信息
4.执行cat test.c.gcov即可看到统计信息
然后执行make html即可生成网页报告
打开result 文件夹html网页,即可看到当前网页报告
参考源码地址:https://github.com/donny681/gcove_dmo
总结
为什么要用这个gcov这个工具呢,方便我们自己检查代码,查看工程中有没有多余不用变量或者函数,或者审核代码有没有多余函数。