gcov 简述

    添加时间:2013-5-31 点击量:

            代码覆盖率是单位测试的一个指标,凡是覆盖率越高,单位测试就做得更完全。(然而,覆盖率是不是和软件质量成正比关系呢?)gcov是GNU对象链中的一个首要的对象,固然gcov是覆盖率很好的对象,然则gcov的更首要的应用是机能的调优。gcov经由过程把守法度的履行,从而断定某行代码有没有履行,履行了几许次。gcov的呈报是基于文本的格局的,看起来是斗劲丢脸点。然则,有个叫lcov的对象,将gcov的呈报格局转换为html的直观情势,后面介绍。

     

        gcov应用:

        如有以下代码:

       1:  #include <stdio.h>


       2:  &#160;


       3:  void bubbleSort( int list[], int size )


       4:  {


       5:      int i, j, temp, swap = 1;


       6:  &#160;


       7:      while (swap) {


       8:  &#160;


       9:          swap = 0;


      10:  &#160;


      11:          for ( i = (size-1) ; i >= 0 ; i-- ) {


      12:  &#160;


      13:              for ( j = 1 ; j <= i ; j++ ) {


      14:  &#160;


      15:                  if ( list[j-1] > list[j] ) {


      16:  &#160;


      17:                      temp = list[j-1];


      18:                      list[j-1] = list[j];


      19:                      list[j] = temp;


      20:                      swap = 1;


      21:  &#160;


      22:                  }


      23:  &#160;


      24:              }


      25:  &#160;


      26:          }


      27:  &#160;


      28:      }


      29:  &#160;


      30:  &#160;


      31:  }


      32:  &#160;


      33:  int main()


      34:  {


      35:      int theList[10]={10, 9, 8, 7, 6, 5, 4, 3, 2, 1};


      36:      int i;


      37:  &#160;


      38:      / Invoke the bubble sort algorithm /


      39:      bubbleSort( theList, 10 );


      40:  &#160;


      41:      / Print out the final list /


      42:      for (i = 0 ; i < 10 ; i++) { 


      43:          printf("%d\n", theList[i]);


      44:      }


      45:      if(i == 0){


      46:          printf("i = 0\n");


      47:      }else{


      48:          printf("i != 0\n");


      49:      }


      50:  &#160;


      51:  }




    &#160;&#160;&#160; 1.&#160; 编译法度是增长 -ftest-coverage -fprofile-arcs 选项。





    [heidong@HEIDONGVM gcov]¥ gcc -o bbsort bbsort.c -ftest-coverage -fprofile-arcs



    &#160;&#160;&#160; 生成.gcno文件。



    &#160;&#160;&#160; 2. 履行法度,将生成.a文件,用gcov法度搜检响应的源代码文件,将生成成果文件。



    [heidong@HEIDONGVM gcov]¥ ./bbsort

    1


    2


    3


    4


    5


    6


    7


    8


    9


    10


    i != 0


    [heidong@HEIDONGVM gcov]¥ gcov bbsort.c


    File‘bbsort.c’


    已履行的行数:95.24% (共 21 行)


    bbsort.c:正在创建‘bbsort.c.gcov



    &#160;&#160;&#160; 3. 搜检响应的成果文件



    [heidong@HEIDONGVM gcov]¥ cat bbsort.c.gcov 
    
    -: 0:Source:bbsort.c
    -: 0:Graph:bbsort.gcno
    -: 0:Data:bbsort.a
    -: 0:Runs:1
    -: 0:Programs:1
    -: 1:#include <stdio.h>
    -: 2:
    1: 3:void bubbleSort( int list[], int size )
    -: 4:{
    1: 5: int i, j, temp, swap = 1;
    -: 6:
    4: 7: while (swap) {
    -: 8:
    2: 9: swap = 0;
    -: 10:
    22: 11: for ( i = (size-1) ; i >= 0 ; i-- ) {
    -: 12:
    110: 13: for ( j = 1 ; j <= i ; j++ ) {
    -: 14:
    90: 15: if ( list[j-1] > list[j] ) {
    -: 16:
    45: 17: temp = list[j-1];
    45: 18: list[j-1] = list[j];
    45: 19: list[j] = temp;
    45: 20: swap = 1;
    -: 21:
    -: 22: }
    -: 23:
    -: 24: }
    -: 25:
    -: 26: }
    -: 27:
    -: 28: }
    -: 29:
    -: 30:
    1: 31:}
    -: 32:
    1: 33:int main()
    -: 34:{
    1: 35: int theList[10]={10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    -: 36: int i;
    -: 37:
    -: 38: / Invoke the bubble sort algorithm /
    1: 39: bubbleSort( theList, 10 );
    -: 40:
    -: 41: / Print out the final list /
    11: 42: for (i = 0 ; i < 10 ; i++) {
    10: 43: printf("%d\n", theList[i]);
    -: 44: }
    1: 45: if(i == 0){
    #####: 46: printf("i = 0\n");
    -: 47: }else{
    1: 48: printf("i != 0\n");
    -: 49: }
    -: 50:
    1: 51:}
    -: 52:
    [heidong@HEIDONGVM gcov]¥



    &#160;



    &#160;&#160;&#160; 可以看到某行履行了几许次,哪些行没有履行过(####标示)。gcov 还可以搜检其他很多的信息,如分支,函数等,具体参考gcov的帮助文档,并测试之。



    &#160;



    &#160;&#160;&#160; 对于文本格局,信赖很多人的感觉不是很直观,于是便有了lcov这个对象,它可以算是gcov的前端对象,如许生成html文件,可以很直观的看到代码覆盖景象。



    &#160;&#160;&#160; lcov不是标准的unix/linux对象,须要,地址是:ltp.sourceforge.net/coverage/lcov.php 重视要翻墙才可以接见。



    &#160;&#160;&#160; 应用体式格式:



    &#160;&#160;&#160; 1. 履行完gcov的步调后,履行下列号令:



    [heidong@HEIDONGVM gcov]¥ lcov --capture --directory ./&#160; --output-file bbsort.info

    Capturing coverage data ./


    Found gcov version: 4.4.6


    Scanning ./ for .a files ...


    Found 1 data files in ./


    Processing bbsort.a


    Finished .info-file creation



    &#160;&#160; 2. 生成html文件:



    [heidong@HEIDONGVM gcov]¥ genhtml bbsort.info --output-directory ./lcov/

    Reading data file bbsort.info


    Found 1 entries.


    Found common filename prefix "/home/heidong/tmp"


    Writing .css and .png files.


    Generating output.


    Processing file gcov/bbsort.c


    Writing directory view page.


    Overall coverage rate:


    &#160; lines......: 95.2% (20 of 21 lines)


    &#160; functions..: 100.0% (2 of 2 functions



    &#160;



    看下生成的html文件:





    &#160;



    &#160;&#160;&#160; 完毕。

    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: