GCOV使用

1. gcov是什么?

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

注:程序概要分析工具是分析代码性能的工具。

2. gcov能做什么?

gcov可以统计
 
 
  • 每一行代码的执行频率
  • 实际上哪些代码确实被执行了
  • 每一段代码(section code)的耗时(执行时间)
因此,gcov可以帮你优化代码,当然这个优化动作还是应该有开发者完成。

3. 如何使用gcov

filename: test.c
#include <iostream>  
using namespace std;  
int main()  
{  
    int i,total;  
    total = 0;  
    for (i=0; i<10; i++)  
        total += i;  
    if (total != 45)  
        cout << "Failure!" << endl;  
    else  
        cout << "Success!" << endl;  
    return 0;  
}  

3.1 使用gcov3个阶段

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

3.2 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 only for 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"执行结果相同。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值