`

Linux平台代码覆盖率测试工具GCOV简介

 
阅读更多

1. gcov是什么?

2. gcov能做什么?

3. 如何使用gcov

3.1 使用gcov3个阶段

(1) 编译

(2) 收集信息

(3) 报告

3.2 gcov的选项

(1) -a, --all-blocks

(2) -b, --branch-probabilities

(3) -c, --branch-counts

4. 小结

 

1. gcov是什么?

 

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

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

 

2. gcov能做什么?

 

gcov可以统计

  • 每一行代码的执行频率
  • 实际上哪些代码确实被执行了
  • 每一段代码(section code)的耗时(执行时间)

因此,gcov可以帮你优化代码,当然这个优化动作还是应该有开发者完成。

 

3. 如何使用gcov

 

笔者也以gcovmanual页自带的例子为例,代码(没有做任何改动)如下。

 

filename: test.c

Linux平台代码覆盖率测试工具GCOV简介

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

 

其他选项,请读者参考相关文档。

 

4. 小结

 

本文简单介绍了Linux平台GCC自带的代码覆盖率测试工具GCOV的基本情况是使用方法。详细研究需要参考官方文档或者一些研究者的论文。

 

 

Reference

Gcovmanual

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

分享到:
评论

相关推荐

    OpenHarmony覆盖率测试,gcov及lcov的原理和使用简介

    采用覆盖率驱动的验证方式可以量化验证进度,保证验证的完备性。本文主要介绍了openharmony代码和分支覆盖率测试中所使用的工具(即gcov及lcov)的简介、工作原理及使用方法。

    使用gcov完成代码覆盖率的测试

    使用gcov完成代码覆盖率的测试.Gcov作为gnu/gcc工作组件之一,是一款的免费的代码覆盖率测试工具,而且可以结合lcov生成美观的html的测试报表。本文介绍一些gcov的使用方法,基本原理,一些实际中可能会遇到的问题...

    gcov-tools-1.0.tar.gz

    希望能对通过gcc覆盖率测试工具GCOV进行覆盖率测试相关工作的同行有些许的帮助。 其中,gcov的输入是一个.c文件,前提是已经编译生成了.gcno文件并运行可执行程序生成.gcda文件;gcov根据.c文件相应的.gcda文件和....

    gcov-1.0.tar.gz

    希望能对通过gcc覆盖率测试工具GCOV进行覆盖率测试相关工作的同行有些许的帮助。 gcov的输入是一个.c文件,前提是已经编译生成了.gcno文件并运行可执行程序生成.gcda文件;gcov根据.c文件相应的.gcda文件和.gcno文件...

    gcov命令 测试代码覆盖率

    gcov命令是一款测试程序的代码覆盖率的工具。 gcov可以统计每一行代码的执行频率,实际上哪些代码确实被执行了,每一段代码的执行时间。 gcov只在使用GCC编译的代码上工作。它与任何其他概要或测试覆盖机制不兼容。...

    Linux平台下代码覆盖率报告自动化输出设计

    轻量级覆盖率测试工具GCOV在使用上具有操作复杂繁琐的弊端.本文所述的设计基于GCOV覆盖率测试的原理,依据shell脚本批处理的特点将各部分操作封装为脚本工具;通过Expect脚本工具对上一操作是否成功进行断言,实现各...

    afl-cov, 使用afl模糊测试案例生成gcov的代码覆盖率结果.zip

    afl-cov, 使用afl模糊测试案例生成gcov的代码覆盖率结果 AFL Fuzzing Fuzzing Fuzzing Fuzzing简介afl-cov 使用 AFL fuzzer afl-fuzz 生成的测试用例文件为目标二进制文件生成gcov代码覆盖率结果。 为了确定AFL的新...

    lcov for linux gcov

    lcov for linux gcovlcov for linux gcovlcov for linux gcovlcov for linux gcovlcov for linux gcovlcov for linux gcov

    Linux Kernel GCOV - tool analysis

    详细描述如何使用gcov工具来进行内核的代码覆盖率测试。包括linux-2.4内核和linux-2.6内核。极度推荐!

    linux gcov 工具详细介绍

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

    gcov-dump-1.0.tar.gz

    希望能对通过gcc覆盖率测试工具GCOV进行覆盖率测试相关工作的同行有些许的帮助。 gcov-dump是一个dump程序,输入是一个gcov的文件,或者.gcda,即gcov的data文件;或者.gcno,即gcov的note文件。

    代码覆盖率分析工具Gcovr.zip

    Gcovr 提供一个工具用来管理 GNU gcov 工具病生成概要代码覆盖率结果。其灵感来自于 Python 的 coverage.py 包。 标签:Gcovr

    CodeCoverageExampleQt:在 Mac OS 上使用 Qt 5 和 GCOV 的代码覆盖率

    在 Mac OS 上使用 Qt 5 和 GCOV 的代码覆盖率 这是如何在 Mac OS 上使用 Qt 5 和 GCOV 生成代码覆盖率的示例。 您可以在上阅读整个教程。

    Gcov report

    gcov theory, usage, realization process

    使用gcc/gcov生成代码覆盖率报告

    使用gcc/gcov生成代码覆盖率报告-源码

    pycover:pycover.py脚本的存储库,用于处理gcov代码覆盖率结果

    下文所述的GCC命令行选项用于检测代码,以进行代码覆盖率分析。 这些描述直接来自gcc命令行选项文档。 -fprofile-arcs添加代码,以便检测程序流args。 在执行期间,程序记录每个分支和调用执行了多少次,以及执行或...

    linux白盒测试流程

    分析代码覆盖率就是为了  本文主要结合gdb和gcov开源工具,在linux环境下进行白盒测试。  白盒测试的主要目的有两点,一点是验证软件需要是否在代码中被覆盖,二是进行代码覆盖率分析,尽可能多的覆盖所有软件代码...

    C/C++覆盖率在NGINX测试中的应用

    左挑右选最后看中了基于GCOV的LCOV作为NGINX测试的覆盖率统计工具。选择LCOV的原因很简单:一是适合GCOV是GCC配套的测试覆盖率工具;二是NGINX是纯C的程序,GCOV对纯C代码的覆盖率展现更加精确;三是LCOV作为GCOV的...

    gcovtools:gcov(GCCClang 代码覆盖率)解析器和翻译器

    工具 gcovtools提供了各种工具和实用程序来处理从发出的覆盖率数据。快速开始首先,除非您还没有这样做,否则请使用clang --coverage编译您的项目并使用llvm-cov消化输出(有关示例,请参见src目录)。 您应该最终...

    如何使用lcov生成diff代码覆盖率报告

    lcov是建立在gcov之上的一个可以生成html代码覆盖率报告的工具,最近公司开始尝试引入代码覆盖来提高产品质量,lcov很好地满足了我们的需求,虽然lcov本身支持生成代码覆盖率的diff报告,但是跟我们的需求不太符合。...

Global site tag (gtag.js) - Google Analytics