一、GCOV简介
Gcov工具的基本功能是可以查看测试时代码执行的覆盖率,包括函数覆盖,语句覆盖,分支覆盖等覆盖内容。有助于分析被测程序的缺陷。使用该工具可以查看程序在某分支处的执行频率,从而分析程序的性能。
二、GCOV使用
gcov伴随gcc 发布。gcc编译加入-fprofile-arcs -ftest-coverage
参数生成二进制程序,执行测试用例生成代码覆盖率信息。
fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵(instrumented):gcc添加了代码来清点这些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码(instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵工具代码。
gcov主要使用.gcno和.gcda两个文件。
- gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。
- gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息(而gcda只能在程序运行完毕后才能产生的)。
话不多说,举个栗子。
手头有一个hello.c的例子,源代码如下:
> #include<stdio.h>
#include<stdlib.h>
void main()
{
int i = 1;
if(i == 1)
printf("helloworld!\n");
else
printf("im not good!\n");
}
编译:`gcc hello.c -fprofile-arcs -ftest-coverage -o hello`
运行:`./hello` 输出:`helloworld!`
执行:gcov hello.c
输出如下:
File 'hello.c'
Lines executed:83.33% of 6
Creating 'hello.c.gcov'
由上可知:在执行gcov hello.c 的同时,生成了hello.c.gcov文件
下面查看gcov文件:
cat hello.c.gcov
输出如下: -: 0:Source:hello.c
1: 3:void main()
-: 4:{
1: 5: int i = 1;
1: 6: if(i == 1)
1: 7: printf("helloworld!\n");
-: 8: else
#####: 9: printf("im not good!\n");
1: 10:}