• 使用GCOV进行代码覆盖率统计


    GCOV是随GCC一起发布的用于代码覆盖率统计的工具,一般配合其图形化工具LCOV一起使用。

    一、安装

    GCOV不需要单独安装,LCOV下载后执行sudo make install即可完成安装。

    二、使用

    下面以针对hello.c文件的覆盖率统计为例,说明使用方法。

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

    编译:

            # gcc -fprofile-arcs -ftest-coverage hello.c -o hello       (编译完成后,会生成:hello.gcno,由-ftest-coverage产生,它包含了重建基本块图和相应的块的源码的行号的信息)

    运行:

            # ./hello      (这一步会生成 hello.gcda, 由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息)

    生成代码覆盖信息:

            # gcov hello.c       (这一步生成hello.c.gcov,就是代码覆盖信息,hello.c.gcov 文件中包含了代码覆盖的统计数据,数字代表了每行代码被执行的次数及行号)

    到这一步,就可以打开hello.c.gcov查看代码覆盖率,但是不够直观,因此需要借助LCOV实现代码覆盖率统计数据的图形化显示。

    生成LCOV可读的文件:

           # 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,发现并没有在当前目录生成gcda文件,进一步执行gcov hello.c可见如下错误:

    hello.gcda:无法打开数据文件,假定未被执行过

    3.gcno:cannot open notes file

    File ‘Hello.c’

    没有可执行行

    Removing ‘hello.c.gcov

    生成上述错误的原因是所使用机器以前有人在bash_profile中对GCOV进行了配置,指定生成gcda文件到其它的路径了。解决的方法很简单,只要设一下GCOV_PREFIX和GCOV_PREFIX_STRIP这两个环境变量就可以了。GCOV_PREFIX制定生成数据文件的前缀,GCOV_PREFIX_STRIP表示需要在原来的路径上去掉多少层目录,通过指定这两个变量的值把数据文件生成到我们想要的地方

    export GCOV_PREFIX=”/home/dce/work/test/”
    export GCOV_PREFIX_STRIP=5
  • 相关阅读:
    矩阵遍历 局部处理 661. 图片平滑器
    最小堆make_heap(), pop_heap()和push_heap()
    vector<pair<int, int>>或者有序map
    简单的滑动窗口 643. 子数组最大平均数 I
    js中getYear()和getFullYear()的区别
    异常:No WebApplicationContext found: no ContextLoaderListener registered?
    异常:Duplicate key or integrity constraint violation message from server: "Duplicate entry '0' for key 1"
    异常:the type net.sf.hibernate.lockmode cannot be resolved, it is indirectly referenced from required .class files
    使用cxf写web service的简单实例
    struts1多文件上传、下载实例
  • 原文地址:https://www.cnblogs.com/ttssrs/p/9990574.html
Copyright © 2020-2023  润新知