GCOV的使用-测试代码覆盖率

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

1. gcov是什么?

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

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

2. gcov能做什么?

gcov可以统计

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

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

 

3. 如何使用gcov

#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) 编译

             

     $ g++ -fprofile-arcs -ftest-coverage -o main main.cpp
          $   ls

-rwxrwxr-x. 1 heli heli 20281 Dec  7 11:54 main
-rw-rw-r--. 1 heli heli   217 Dec  7 10:57 main.cpp
-rw-rw-r--. 1 heli heli  6632 Dec  7 11:54 main.gcno

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

(2) 收集信息


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

 

(3) 报告

$ ./main 
Success!
$ ll
total 36
-rwxrwxr-x. 1 heli heli 20281 Dec  7 11:54 main
-rw-rw-r--. 1 heli heli   217 Dec  7 10:57 main.cpp
-rw-rw-r--. 1 heli heli   784 Dec  7 11:56 main.gcda
-rw-rw-r--. 1 heli heli  6632 Dec  7 11:54 main.gcno
$ gcov main.cpp 
File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ios_base.h'
Lines executed:0.00% of 2
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ios_base.h:creating 'ios_base.h.gcov'

File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream'
Lines executed:0.00% of 11
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:creating 'ostream.gcov'

File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_ios.h'
Lines executed:0.00% of 10
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_ios.h:creating 'basic_ios.h.gcov'

File 'main.cpp'
Lines executed:88.89% of 9
main.cpp:creating 'main.cpp.gcov'

File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/iostream'
Lines executed:100.00% of 1
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/iostream:creating 'iostream.gcov'

File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/char_traits.h'
Lines executed:0.00% of 2
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/char_traits.h:creating 'char_traits.h.gcov'

File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_facets.h'
Lines executed:0.00% of 5
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_facets.h:creating 'locale_facets.h.gcov'
$ ll
total 300
-rw-rw-r--. 1 heli heli  22753 Dec  7 11:57 basic_ios.h.gcov
-rw-rw-r--. 1 heli heli  25834 Dec  7 11:57 char_traits.h.gcov
-rw-rw-r--. 1 heli heli  44130 Dec  7 11:57 ios_base.h.gcov
-rw-rw-r--. 1 heli heli   4084 Dec  7 11:57 iostream.gcov
-rw-rw-r--. 1 heli heli 132403 Dec  7 11:57 locale_facets.h.gcov
-rwxrwxr-x. 1 heli heli  20281 Dec  7 11:54 main
-rw-rw-r--. 1 heli heli    217 Dec  7 10:57 main.cpp
-rw-rw-r--. 1 heli heli    618 Dec  7 11:57 main.cpp.gcov
-rw-rw-r--. 1 heli heli    784 Dec  7 11:56 main.gcda
-rw-rw-r--. 1 heli heli   6632 Dec  7 11:54 main.gcno
-rw-rw-r--. 1 heli heli  27743 Dec  7 11:57 ostream.gcov

生成:

     main.cpp.gcov
文件,该文件记录了每行代码被执行的次数。

 

main.cpp.gcov文件内容如下:

-:    0:Source:main.cpp
        -:    0:Graph:main.gcno
        -:    0:Data:main.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <iostream>
        -:    2:using namespace std;
        1:    3:int main()
        -:    4:{
        -:    5:    int i,total;
        1:    6:    total = 0;
        -:    7:
       11:    8:    for (i=0; i<10; i++)
       10:    9:        total += i;
        -:   10:
        1:   11:    if (total != 45)
    #####:   12:        cout << "Failure!" << endl;
        -:   13:    else
        1:   14:        cout << "Success!" << endl;
        1:   15:    return 0;
        3:   16:}

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 main.cpp

$ gcov -a main.cpp
File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ios_base.h'
Lines executed:0.00% of 2
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ios_base.h:creating 'ios_base.h.gcov'

File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream'
Lines executed:0.00% of 11
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:creating 'ostream.gcov'

File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_ios.h'
Lines executed:0.00% of 10
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_ios.h:creating 'basic_ios.h.gcov'

File 'main.cpp'
Lines executed:88.89% of 9
main.cpp:creating 'main.cpp.gcov'

File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/iostream'
Lines executed:100.00% of 1
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/iostream:creating 'iostream.gcov'

File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/char_traits.h'
Lines executed:0.00% of 2
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/char_traits.h:creating 'char_traits.h.gcov'

File '/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_facets.h'
Lines executed:0.00% of 5
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/locale_facets.h:creating 'locale_facets.h.gcov'

main.cpp.gcov文件内容。

-:    0:Source:main.cpp
        -:    0:Graph:main.gcno
        -:    0:Data:main.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <iostream>
        -:    2:using namespace std;
        1:    3:int main()
        -:    4:{
        -:    5:    int i,total;
        1:    6:    total = 0;
        -:    7:
       11:    8:    for (i=0; i<10; i++)
        1:    8-block  0
       10:    8-block  1
       11:    8-block  2
       10:    9:        total += i;
        -:   10:
        1:   11:    if (total != 45)
        1:   11-block  0
    #####:   12:        cout << "Failure!" << endl;
    $$$$$:   12-block  0
        -:   13:    else
        1:   14:        cout << "Success!" << endl;
        1:   14-block  0
        1:   15:    return 0;
        1:   15-block  0
        3:   16:}
        1:   16-block  0
        1:   16-block  1
        1:   16-block  2
        1:   16-block  3

 (2) -b--branch-probabilities 

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

# gcov -b main.cpp

(3) -c--branch-counts

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

# gcov -c main.cpp


目录
相关文章
|
10天前
|
测试技术 C语言
网站压力测试工具Siege图文详解
网站压力测试工具Siege图文详解
19 0
|
1月前
|
JavaScript jenkins 测试技术
这10款性能测试工具,收藏起来,测试人的工具箱!
这10款性能测试工具,收藏起来,测试人的工具箱!
|
1月前
|
人工智能 监控 测试技术
利用AI辅助工具提升软件测试效率
【2月更文挑战第17天】 随着科技的不断发展,人工智能(AI)在各个领域的应用越来越广泛。在软件测试领域,AI技术也发挥着重要作用。本文将探讨如何利用AI辅助工具提升软件测试效率,包括自动化测试、智能缺陷识别和预测等方面。通过引入AI技术,软件测试过程将变得更加高效、准确和可靠。
164 1
|
1月前
|
Web App开发 前端开发 测试技术
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
|
29天前
|
测试技术
现代软件测试中的自动化工具与挑战
传统软件测试面临着越来越复杂的系统架构和不断增长的测试需求,自动化测试工具应运而生。本文将探讨现代软件测试中自动化工具的应用和挑战,深入分析其优势与局限性,为软件测试领域的发展提供思路和启示。
|
25天前
|
jenkins 测试技术 持续交付
现代软件测试中的自动化工具与挑战
随着软件开发领域的不断发展,自动化测试工具在测试过程中扮演着越来越重要的角色。本文将探讨现代软件测试中自动化工具的应用及面临的挑战,旨在帮助开发人员和测试人员更好地理解和应对自动化测试中的问题。
|
10天前
|
测试技术 Linux Apache
网站压力测试工具webbench图文详解
网站压力测试工具webbench图文详解
8 0
|
18天前
|
Java 测试技术 API
软件测试中的自动化工具与策略
软件测试是确保软件质量的重要环节,而自动化测试工具和策略的应用在提高测试效率和准确性方面发挥着重要作用。本文将介绍几种常见的自动化测试工具,并探讨在软件测试中应用自动化测试的最佳实践和策略。
|
20天前
|
Web App开发 Java 测试技术
深入理解与应用软件自动化测试工具Selenium
随着软件开发的快速发展,软件测试在保证产品质量方面发挥着越来越重要的作用。其中,自动化测试以其效率高、成本低的特点受到了广大开发者的欢迎。本文主要介绍了自动化测试工具Selenium的基本概念、原理以及在实际开发中的应用,旨在帮助读者更好地理解和使用Selenium进行高效的自动化测试。
22 4
|
28天前
|
人工智能 测试技术 虚拟化
现代软件测试中的自动化工具与技术
随着信息技术的迅猛发展,现代软件开发和测试领域也在不断创新。本文将探讨现代软件测试中自动化工具与技术的应用。通过分析自动化测试的优势、挑战以及最佳实践,帮助读者更好地理解当前软件测试领域的发展趋势,并为实际工作提供参考。
16 1