Welcome 微信登录

首页 / 操作系统 / Linux / Linux平台代码覆盖率测试工具GCOV简介

Content 1. gcov是什么?2. gcov能做什么?3. 如何使用gcov?3.1 使用gcov的3个阶段(1) 编译(2) 收集信息(3) 报告3.2 gcov的选项(1) -a, --all-blocks(2) -b, --branch-probabilities(3) -c, --branch-counts4. 小结 1. gcov是什么?
  • Gcov is GCC Coverage
  • 是一个测试代码覆盖率的工具
  • 是一个命令行方式的控制台程序
  • 伴随GCC发布,配合GCC共同实现对C/C++文件的语句覆盖和分支覆盖测试;
  • 与程序概要分析工具(profiling tool,例如gprof)一起工作,可以估计程序中哪一段代码最耗时;
注:程序概要分析工具是分析代码性能的工具。 2. gcov能做什么? gcov可以统计
  • 每一行代码的执行频率
  • 实际上哪些代码确实被执行了
  • 每一段代码(section code)的耗时(执行时间)
因此,gcov可以帮你优化代码,当然这个优化动作还是应该有开发者完成。 3. 如何使用gcov? 笔者也以gcov的manual页自带的例子为例,代码(没有做任何改动)如下。 filename: test.c

3.1 使用gcov的3个阶段 (1) 编译 
# gcc -fprofile-arcs -ftest-coverage -o test test.c# lstest  test.c  test.gcno
-fprofile-arcs -ftest-coverage告诉编译器生成gcov需要的额外信息,并在目标文件中插入gcov需要的extra profiling information。因此,该命令在生成可执行文件test的同时生成test.gcno文件(gcov note文件)。 (2) 收集信息
# ./testSuccess# lstest  test.c  test.gcda  test.gcno
执行该程序,生成test.gcda文件(gcov data文件)。 (3) 报告
# gcov test.cFile "test.c"Lines executed:87.50% of 8test.c:creating "test.c.gcov" # lstest  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 ");        -:   14:    else        1:   15:        printf ("Success ");        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.cFile "test.c"Lines executed:87.50% of 8test.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 ");    $$$$$:   13-block  0        -:   14:    else        1:   15:        printf ("Success ");        1:   15-block  0        1:   16:    return 0;        1:   16-block  0        -:   17:}        -:   18:
(2) -b, --branch-probabilities 在.gcov文件中输出每个分支的执行频率,并有分支统计信息。 # gcov -b test.cFile "test.c"Lines executed:87.50% of 8Branches executed:100.00% of 4Taken at least once:75.00% of 4Calls executed:50.00% of 2test.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 ");call    0 never executed        -:   14:    else        1:   15:        printf ("Success ");call    0 returned 100%        1:   16:    return 0;        -:   17:}        -:   18:
(3) -c, --branch-counts 在.gcov文件中输出每个分支的执行次数。
# gcov -c test.cFile "test.c"Lines executed:87.50% of 8test.c:creating "test.c.gcov" -c是默认选项,其结果与"gcov test.c"执行结果相同。 其他选项,请读者参考相关文档。 4. 小结 本文简单介绍了Linux平台GCC自带的代码覆盖率测试工具GCOV的基本情况是使用方法。详细研究需要参考官方文档或者一些研究者的论文。