【C++】非原创|统计代码覆盖率(一:C)
网络上php代码的覆盖率统计特别多,C/C++的不多见,大概是因为c/C++的收费?不知道= =
感谢原作者,原微博地址:http://www.cnblogs.com/turtle-fly/archive/2013/01/09/2851474.html
http://ltp.sourceforge.net/coverage/lcov.php demo
主要操作是:1 用gcov完成对c/c++文件的覆盖;2 通过lcov生成覆盖率报告;3 集成到jenkins的自动化case(需要自己做)
本章只写最简单的应用:编译单个c文件,生成lcov报告
一 搭建环境
我是直接在linux下运行程序,因此只需安装gcov和lcov环境即可
- 安装gcov环境
- 惭愧我服务器上有,所以没有安装。版本如下:gcov -v(跟gcc绑定的)
- 安装lcov环境:https://sourceforge.net/projects/ltp/ 可下载不同版本
cd /usr/local wget http://sourceforge.net/projects/ltp/files/Coverage%20Analysis/LCOV-1.12/lcov-1.12.tar.gz tar -xzvf lcov-1.12.tar.gz cd lcov-1.12 make install lcov -v 查看版本:lcov: LCOV version 1.12 即安装成功不需要编译,直接安装。lcov, gendesc, genhtml, geninfo, genpng将被安装到/usr/bin目录。
二 编写一个简单的c++文件。fib.c(斐波那契数列)
1 #include <stdio.h> 2 int fibonacci(int n); 3 4 int main () 5 { 6 int fib; 7 int n; 8 9 for (n = 0; n <= 10; n++) { 10 fib = fibonacci(n); 11 printf("fibonnaci(%d) = %d\n", n, fib); 12 } 13 14 return 0; 15 } 16 17 int fibonacci(int n) 18 { 19 int fib; 20 if (n <= 0) { 21 fib = 0; 22 } 23 else if (n == 1) { 24 fib = 1; 25 } 26 else { 27 fib = fibonacci(n -1) + fibonacci(n - 2); 28 } 29 30 return fib; 31 }
三 gcov覆盖代码
1. 编译:gcc -c fib.c -ftest-coverage -fprofile-arcs
检查发现生成了fib.gcno和fib.o文件,即正确
.gcno由-ftest-coverage产生,包含了重建基本块图和相应的块的源码的行号的信息。
2 链接:以下三者择一即可,生成可执行文件fib
gcc fib.o -o fib --coverage //我用的这个 gcc fib.o -o fib -lgcov gcc fib.o -o fib -fprofile-arcs
3 运行fib:./fib
生成gcda文件,.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。见附1
4 生成gcov报告:gcov fib.c
生成的fib.c.gcov文件包含了代码覆盖的统计数据,数字代表每行代码被执行的次数及行号。
1 -: 0:Source:fib.c2 -: 0:Graph:fib.gcno3 -: 0:Data:fib.gcda4 -: 0:Runs:15 -: 0:Programs:16 -: 1:#include <stdio.h>7 -: 2:8 -: 3:int fibonacci(int n);9 -: 4:10 1: 5:int main ()11 -: 6:{12 -: 7: int fib;13 -: 8: int n;14 -: 9:15 12: 10: for (n = 0; n <= 10; n++) {16 11: 11: fib = fibonacci(n);17 11: 12: printf("fibonnaci(%d) = %d\n", n, fib);18 -: 13: }19 -: 14:20 1: 15: return 0;21 -: 16:}22 -: 17:23 453: 18:int fibonacci(int n)24 -: 19:{25 -: 20: int fib;26 453: 21: if (n <= 0) {27 89: 22: fib = 0;28 -: 23: }29 364: 24: else if (n == 1) {30 143: 25: fib = 1;31 -: 26: }32 -: 27: else {33 221: 28: fib = fibonacci(n -1) + fibonacci(n - 2);34 -: 29: }35 -: 30:36 453: 31: return fib;37 -: 32:}
man
四 lcov整理覆盖率数据
1. 使用已生成的.gcon .gcda文件生成覆盖率数据fib.info文件 lcov -c -o fib.info -d .
其中:-c lcov的操作,表示要去捕获覆盖率数据
-o 输出文件,后面跟目标文件
-d 源文件.gcno .gcda所在文件夹,此处为'.'意为当前文件夹
[mobdev@ip-*** gtest]$lcov -c -o fib.info -d .
Capturing coverage data from .
Found gcov version: 4.8.3
Scanning . for .gcda files ...
Found 1 data files in .
Processing fib.gcda
Finished .info-file creation //表示成功
2. 生成html格式的报告: genhtml fib.info -o fib_result
即将文件fib.info生成html输出到fig_result文件夹内
[mobdev@ip-*** gtest]$genhtml fib.info -o fib_result Reading data file fib.info Found 1 entries. Found common filename prefix "***cppTest" Writing .css and .png files. Generating output. Processing file gtest/fib.c Writing directory view page. Overall coverage rate:lines......: 100.0% (12 of 12 lines) //代码逻辑行覆盖率functions..: 100.0% (2 of 2 functions)//代码方法覆盖率
3 压缩文件下载到windows系统,并打开查看网页版
tar cvf fib_result.tar.gz fib_result/ sz fib_result.tar.gz //下载windows路径 在windows路径下,解压tar.gz文件,进入路径,在浏览器打开index.html如下图
五 问题
1 执行lcov命令时,报错"Out of memory!",生成的fib.info文件夹为空。是因为版本不匹配
解决:查看版本如下,需要更新lcov的版本。1.10以上的lcov才支持4.8的gcov
[user@ip-******* gtest]$gcov -v gcov (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9) Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.[user@ip-******* gtest]$lcov -v lcov: LCOV version 1.9
2 后续再补充
附件为编译的各个文件的解析。
附1 od -t x4 -w16 fib.gcda
http://www.linuxidc.com/Linux/2011-05/36537.htm
转载于:https://www.cnblogs.com/zhaoxd07/p/5604049.html
【C++】非原创|统计代码覆盖率(一:C)相关推荐
- 青龙羊毛——旅游链(搬运,非原创)
大佬叫写的毛,不知道有啥子有,自己慢慢玩吧! 码子 大佬码子→尊重知识 菜鸡码子→感谢支持 这次没人怀疑码子真假了吧? 脚本 ql raw https://gitee.com/soy-tool/app ...
- 青龙羊毛——东方头条(搬砖,非原创)
改版公告--新青龙羊毛 1.东方头条 软件自己去找,不放邀请链接! 作者码子:003584319 我的码子:003170160(别填我码子了,刚注册就黑了!) 2.脚本 宝箱 https://raw. ...
- 青龙羊毛——杀猪盘(搬砖,非原创)
青龙羊毛改版第一更,杀猪盘合集! 改版公告--新青龙羊毛 1.鑫广 和亿享云差不多的东西,自己看! 2.脚本 https://gitee.com/gossh520/script/raw/master/ ...
- Java 表达式解析(非原创)
因项目需要,在网上找来一套表达式解析方法,由于原来的方法太过于零散,不利于移植,现在整理在同一文件内: 文件中包含5个内部类,源码如下: 1 import java.util.ArrayList; 2 ...
- (淘宝无限适配)移动手机端rem布局详解(转载非原创)
https://www.cnblogs.com/well-nice/p/5509589.html (淘宝无限适配)手机端rem布局详解(转载非原创) 从网易与淘宝的font-size思考前端设计稿与工 ...
- 结构光相机国产、非国产统计参数对比分析
结构光相机国产.非国产统计参数对比分析 1. Kinect v1 Kinect v1深度相机拥有一个RGB彩色摄像头,一个红外线CMOS摄像机和一个红外发射器.相机的红外线CMOS摄像机和红外发射器以 ...
- 智能门锁-手机应用相机国产、非国产统计参数对比分析
智能门锁-手机应用相机国产.非国产统计参数对比分析 智能门锁应用 从2019年1月1日至2020年12月31日,3D人脸识别智能门锁在全市场统计中,总销量已接近20万套.其中德施曼以其先发优势,良好的 ...
- Kinect与TOF、双目、结构光相机比较相机国产、非国产统计参数对比分析
Kinect与TOF.双目.结构光相机比较相机国产.非国产统计参数对比分析 Kinect v1和Kinect v2之间的参数比较 从图中可以看出,Kinect v2的表现比Kinect v1要好得多: ...
- kissme病毒解决办法(非原创)
kissme病毒解决办法(非原创) 几周前发现自己的回收站会莫名奇妙的被清空,在使用软件导入一些文件的时候也会出现找不到的情况,昨天发现一些文件夹莫名其妙变成了exe格式,D盘里一个名为qqpet的文 ...
- 45种攻入后台的方法(非原创,来自伟大的网络)
45种攻入后台的方法(非原创,来自伟大的网络) 1.到Google搜索,site:cq.cn inurl:asp 2.到Google,搜索一些关键字,edit.asp? 韩国肉鸡为多,多数为MSSQL ...
最新文章
- 【C#日期系列(一)】--C#获取某月第一天0分0秒以及最后一天59分59秒
- php如何抓取一行的内容,提取一行作为对象 - PHP 7 中文文档
- Hadoop 大数据平台架构与实践
- 信息学奥赛一本通 1048:有一门课不及格的学生 | OpenJudge NOI 1.4 10
- Java基础学习总结(152)——JDK 1.7和 JDK 1.8中HashMap的实现有什么不同?
- 【Python配置】Win10配置Python3、Numpy、PyCharm、Anaconda
- 《2022产业互联网安全十大趋势》正式发布
- 【HDU5409】CRB and Graph 边双联通 子树最值
- 常见的图标库有哪些?
- 网易评论真搞笑~~~呵呵
- 科技论文写作经验之谈
- [转载] UEFI+GPT双硬盘安装Win10+Ubuntu16.04双系统
- 从0开发《工程测绘大师》小程序之什么是微信小程序篇(一)
- <<算法很美>>——(四)——深入递归<一>——自上而下,自下而上
- 推荐系统之DIN模型(注意力机制对业务的理解)
- crash 和 anr的区别
- 公司突然断网故障排查
- 线上线下课程教学培训小程序开发制作功能介绍
- 拉马努金:“与神对话”的数学天才
- PHM智能诊断及健康管理保障系统