• 代码覆盖工具(gcov、lcov)的使用


    一、安装

    gcov:是随gcc一起发布的,并不需要独立安装;
    lcov:其他博客说是随ltp发布的,结果下载下ltp之后编译了10多分钟,最后也没见lcov,最后到sourceforge下载了lcov单独的代码:

    wget http://ncu.dl.sourceforge.net/project/ltp/Coverage Analysis/LCOV-1.12/lcov-1.12.tar.gz
    tar -zxvf lcov-1.12.tar.gz 
    make
    make install

    二、使用

    以hello.c为例

    #include<stdio.h>
    
    int main(int argc,char* argv[])
    {
        if(argc>1)
           printf("AAAA
    ");
        else
           printf("BBB
    ");
        return 0;
    }
    View Code

    # gcc -fprofile-arcs -ftest-coverage hello.c -o hello       (编译时候加两个参数:-fprofile-arcs -ftest-coverage, 此时会生成:hello.gcno)

    # ./hello                                                                        (此时会生成: hello.gcda, hello.gcno和hello.gcda是gcov引用的关键文件)

    # gcov hello.c                                                                 (gcov根据上面的文件生成了:hello.c.gcov,就是代码覆盖信息,但看起来并不直观)

    [root@localhost gcov2]# cat hello.c.gcov 
            -:    0:Source:hello.c
            -:    0:Graph:hello.gcno
            -:    0:Data:hello.gcda
            -:    0:Runs:1
            -:    0:Programs:1
            -:    1:#include<stdio.h>
            -:    2:
            1:    3:int main(int argc,char* argv[])
            -:    4:{
            1:    5:    if(argc>1)
        #####:    6:       printf("AAAA
    ");
            -:    7:    else
            1:    8:       printf("BBB
    ");
            1:    9:    return 0;
            -:   10:}
    View Code

    # lcov -d . -t 'Hello test' -o 'hello_test.info' -b . -c          (我们借助lcov对hello.c.gcov进行改造,可以看见生成了hello_test.info)

    # genhtml -o result hello_test.info                                  (生成了result文件夹,借助web服务器,我们就可以很直观的看到结果了)

    用浏览器打开index.html,下面是hello.c.gcov.html的信息,着色过的代码,看起来方便多了。

    三、遇到的问题及解决方案

    1.Can't locate Digest/MD5.pm

    错误信息:

    [root@bogon gcov]# lcov -d . -t 'Hello test' -o 'hello_test.info' -b . -c
    Capturing coverage data from .
    Can't locate Digest/MD5.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/bin/geninfo line 57.
    BEGIN failed--compilation aborted at /usr/bin/geninfo line 57.

    解决方法

    perl -MCPAN -e 'install Digest::Perl::MD5'

    如果还不行,那就:

    perl -MCPAN -e 'install Digest::MD5'

    如果报少CPAN的那就先yum install perl-CPAN,然后再执行上面的命令。

    2. geninfo: ERROR

    错误信息:

    Scanning . for .gcda files ...
    Found 1 data files in .
    Processing hello.gcda
    geninfo: ERROR: /home/test/gcov/hello.gcno: reached unexpected end of file

    解决方法:

    把lcov-1.9及以下的版本换成lcov-1.9以上的版本。本文用的是lcov-1.12

    四、参考地址:

    http://blog.csdn.net/jiayanhui2877/article/details/8727193

    http://blog.csdn.net/21cnbao/article/details/40268617

    http://stackoverflow.com/questions/4844188/c-using-gcov-and-lcov-problem

    http://www.cnblogs.com/turtle-fly/archive/2013/01/09/2851474.html

    http://blog.csdn.net/maray/article/details/40401577   (此文说明了gcov的原理)

  • 相关阅读:
    Stm32设置串口300波特率
    STM32F103ZET6移植FreeRTOS过程
    什么时候该用裸机?什么时候该用RTOS?
    又到了立flag时间
    关于掉电数据保存的心得
    一个教训
    下个月回国给自己定目标
    GPRS模块/4G开发过程
    ftp登陆失败,check pass; user unknown
    python深浅拷贝
  • 原文地址:https://www.cnblogs.com/bugutian/p/5929530.html
Copyright © 2020-2023  润新知