gcov介绍+使用实例

1、关于gcov工具:


gcov是gnu/gcc工具库中的一个组件,一般来说,都会被安装的
可以用whereis gcov来找一下

gcov伴随gcc 发布。gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信息。


2、gcov是什么?

  • Gcov is GCC Coverage
  • 是一个测试代码覆盖率的工具
  • 是一个命令行方式的控制台程序
  • 伴随GCC发布配合GCC共同实现对C/C++文件的语句覆盖和分支覆盖测试
  • 与程序概要分析工具(profiling tool,例如gprof)一起工作,可以估计程序中哪一段代码最耗时

总的来说:gcov是一个保险测试工具。当构建一个程序时,gcov会监视一个程序的执行,并且会标识出执行了哪一行源码,哪一行没有执行。更进一步,gcov可以标识出某一行源执行的次数,这对于执行配置很有用(程序在哪里花费了大多数的时间)。因为gcov可以分辨出哪一行没有执行,这对于保险测试工具是很有用的。

3、 使用gcov3个阶段

test.c:

#include<stdio.h>

int main(void)
{
    int i,total;
    total=0;

    for(i=0;i<10;i++)
        total+=i;

    if (total!=45)
        printf("failure\n");
    else
        printf("success\n");
    return 0;
}

(1) 编译

# gcc -fprofile-arcs -ftest-coverage -o test test.c

# ls

test  test.c  test.gcno

-fprofile-arcs -ftest-coverage告诉编译器生成gcov需要的额外信息,并在目标文件中插入gcov需要的extra profiling information。因此,该命令在生成可执行文件test的同时生成test.gcno文件(gcov note文件)

(2) 收集信息

# ./test

Success

# ls

test  test.c  test.gcda  test.gcno

执行该程序,生成test.gcda文件(gcov data文件)

(3) 报告

# gcov test.c

File 'test.c'

Lines executed:87.50% of 8

test.c:creating 'test.c.gcov'

 

# ls

test  test.c  test.c.gcov  test.gcda  test.gcno

生成test.c.gcov文件,该文件记录了每行代码被执行的次数。

 

test.c.gcov文件内容如下,蓝色表示添加的注释。

        -:    0:Source:test.c

        -:    0:Graph:test.gcno

        -:    0:Data:test.gcda

        -:    0:Runs:1

        -:    0:Programs:1

        -:    1:#include          //前面的数字表明该clause被执行的次数,下同

        -:    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++)  //前面的数字11表明该clause被执行11

       10:   10:        total += i;

        -:   11:

        1:   12:    if (total != 45)

    #####:   13:        printf ("Failure/n");

        -:   14:    else

        1:   15:        printf ("Success/n");

        1:   16:    return 0;

        -:   17:}

        -:   18:


gcov的选项

 

gcov的选项不多,也好理解,此处选3个典型的选项并结合例子加以说明。

 

(1) -a--all-blocks

 

.gcov文件中输出每个基本块(basic block)的执行次数。如果没有-a选项,则输出'main'函数这个block的执行次数,如上所示。使用该选项可以

    Write individual execution counts for every basic block.  Normally gcov outputs execution counts onlyfor the main blocks of a line.  With this option you can determine if blocks within a single line are not being executed.

 

# gcov -a test.c

File 'test.c'

Lines executed:87.50% of 8

test.c:creating 'test.c.gcov'

 

Test.c.gcov文件内容。

        -:    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");

    $$$$$:   13-block  0

        -:   14:    else

        1:   15:        printf ("Success/n");

        1:   15-block  0

        1:   16:    return 0;

        1:   16-block  0

        -:   17:}

        -:   18:

(2) -b--branch-probabilities

 

.gcov文件中输出每个分支的执行频率,并有分支统计信息。

 

# gcov -b test.c

File 'test.c'

Lines executed:87.50% of 8

Branches executed:100.00% of 4

Taken at least once:75.00% of 4

Calls executed:50.00% of 2

test.c:creating 'test.c.gcov'

        -:    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)

function main called 1 returned 100% blocks executed 86%

        1:    4:{

        -:    5:    int i, total;

        -:    6:

        1:    7:    total = 0;

        -:    8:

       11:    9:    for (i = 0; i < 10; i++)

branch  0 taken 91%

branch  1 taken 9% (fallthrough)

       10:   10:        total += i;

        -:   11:

        1:   12:    if (total != 45)

branch  0 taken 0% (fallthrough)

branch  1 taken 100%

    #####:   13:        printf ("Failure/n");

call    0 never executed

        -:   14:    else

        1:   15:        printf ("Success/n");

call    0 returned 100%

        1:   16:    return 0;

        -:   17:}

        -:   18:

(3) -c--branch-counts

 

.gcov文件中输出每个分支的执行次数。

# gcov -c test.c

File 'test.c'

Lines executed:87.50% of 8

test.c:creating 'test.c.gcov'

 

-c是默认选项,其结果与"gcov test.c"执行结果相同。



参考:

http://blog.csdn.net/livelylittlefish/article/details/6321861

http://gcc.gnu.org/onlinedocs/gcc/Gcov.html

http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html

http://dev.firnow.com/course/6_system/linux/Linuxjs/20071129/88999.html


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值