c++代码覆盖率工具使用
代码覆盖工具(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\n");
else
printf("BBB\n");
return 0;
}
复制代码
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\n");
-: 7: else
1: 8: printf("BBB\n");
1: 9: return 0;
-: 10:}
复制代码
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,然后再执行上面的命令。
- 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的原理)
原文地址:https://www.cnblogs.com/xiao-yyyy/p/11387538.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Thinkphp5 如何隐藏入口文件index.php(URL重写)
- 在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
- thinkphp5使html5实现动态跳转的例子
- php 自定义函数实现将数据 以excel 表格形式导出示例
- 解决tp5在nginx下修改配置访问的问题
- 在PHP中实现使用Guzzle执行POST和GET请求
- c 语言函数指针之回调函数
- 解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
- php和js实现根据子网掩码和ip计算子网功能示例
- php ZipArchive实现多文件打包下载实例
- PHP 代码简洁之道(小结)
- Thinkphp 在api开发中异常返回依然是html的解决方式
- Laravel 连接(Join)示例
- 解决Laravel自定义类引入和命名空间的问题
- 详解Laravel服务容器的绑定与解析