【C++】统计代码覆盖率(二)
嗷嗷嗷!!!好激动,我好蠢。不过最后还是解决了。呜呜呜
有些都是东一块西一块查的,如果有侵权欢迎私信我,我注明出处。
一 gcov&CMake
昨天试了下测试代码和被测代码都是c++的情况,直接编译生成gcno文件,再一运行,生成gcda文件。脚本统计,blingbling生成了报表,简直漂亮!
不过我们的工程比较大= =。编译时也需要很多依赖文件。
因此使用场景为:在机器A目录编译,拷贝纯bin文件到B目录上运行。编译方式为CMake
1 修改编译脚本
- 找到CMakeList.txt文件,添加如下内容:
# coverage option
OPTION (ENABLE_COVERAGE "Use gcov" OFF)
MESSAGE(STATUS ENABLE_COVERAGE=${ENABLE_COVERAGE})
IF(ENABLE_COVERAGE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
# SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
ENDIF()- 编译时使用命令如下:
cmake -DENABLE_COVERAGE=ON ..
- 编译后查看文件目录:build一路向下
******/build/CMakeFiles/ad_server.dir/src
$ll
-rw-rw-r-- mobdev mobdev Jun : A.cpp.gcno
-rw-rw-r-- mobdev mobdev Jun : A.cpp.o
-rw-rw-r-- mobdev mobdev Jun : B.cpp.gcno
-rw-rw-r-- mobdev mobdev Jun : B.cpp.o
-rw-rw-r-- mobdev mobdev Jun : C.cpp.gcno
-rw-rw-r-- mobdev mobdev Jun : C.cpp.o
-rw-rw-r-- mobdev mobdev Jun : D.cpp.gcno
-rw-rw-r-- mobdev mobdev Jun : D.cpp.o- 如上表示编译成功
2 拷贝bin文件到目录B,注意保持目录B与目录A的为同一次编译结果(我是检查md5文件)
如果是从机器A到机器B,注意配置gcov_prefix交叉编译。
3 启动你的服务,按原方式执行测试用例。case执行完成后进入下一步
4 生成gcda文件。vim test.sh,内容如下:
#!/bin/sh
SERVER_NAME=$ pid=`ps -ef | grep $SERVER_NAME | grep -v "grep" | awk '{print $2}'`
echo $pid
gdb -q attach $pid <<__EOF__
p __gcov_flush()
__EOF__执行命令:sh test.sh your_servername
5 检查:因为这次我的编译和测试在同台机器的不同目录,因为gcda文件会生成到编译时的gcno同目录,检查其中已有gcda文件。如下:
******/build/CMakeFiles/ad_server.dir/src
$ll
-rw-rw-r-- mobdev mobdev Jun : A.cpp.gcda
-rw-rw-r-- mobdev mobdev Jun : A.cpp.gcno
-rw-rw-r-- mobdev mobdev Jun : A.cpp.o
-rw-rw-r-- mobdev mobdev Jun : B.cpp.gcda
-rw-rw-r-- mobdev mobdev Jun : B.cpp.gcno
-rw-rw-r-- mobdev mobdev Jun : B.cpp.o
二 生成html页面
进入gcda和gcno文件所在目录,执行
lcov -c -o result.info -b . -d . //生成info文件
genhtml result.info -o Report //生成html文件
tar cvf Report.tar.gz Report //压缩文件
sz Report.tar.gz //下载到windows系统
解压打开其中的index.html即可看到测试代码覆盖率
三 生成xml报告
1 安装gcovr
cd /usr/local
wget https://github.com/gcovr/gcovr/archive/3.2.tar.gz
tar -xvf 3.2.tar.gz
cd gcovr-3.2/scripts
cp gcovr /usr/bin
2 在编译路径下执行 gcovr -r .即可查看覆盖率情况
3 为了使其生成Cobertura可用的xml文件,可以使用命令
gcovr -r . --output yourdir/coverage.xml -xml-pretty
vim coverage.xml即可看到xml报告
四 问题
1 描述:无法生成gcda文件
原因如下:
- 用户代码调用 exit 正常结束时,gcov_exit 函数得到调用,其继续调用 __gcov_flush 函数输出统计数据到 *.gcda 文件中
- 若用户进程并非调用 exit 正常退出,覆盖率统计数据就无法输出,也就无从生成报告了。后台服务程序若非专门设计,一旦启动就很少主动退出,用 kill 杀死进程强制退出时就不会调用 exit,因此没有覆盖率统计结果产生。
解决:执行(一)4步骤即可。
2 描述:无法组合gcda和gcno文件:"stamp mismatch with notes file"
原因如下:
- 网上找了好多答案,说是编译版本不一致,导致时间戳不一致,我一直没有理解。
- 确认自己这儿是因为生成gcno文件的编译版本和生成gcda文件的版本不一致。
我的操作:
编译二进制文件ad.server,生成了gcno文件
拷贝ad.server进测试环境,测试生成了gcda
中途又编译了一次ad.server,生成了新的gcno文件.
即gcno和gcda文件使用的ad.server并不是同一次编译的结果。
最后通过对比两个地方的ad.server的md5发现了不同,我好蠢= =
解决:解决很简单,确保你的版本就ok了,可以对比二进制文件的md5.
查看时间戳:hexdump -e '"%x\n"' -s8 -n4 A.cpp.gcno 可以看到时间戳。
hexdump -e '"%x\n"' -s8 -n4 A.cpp.gcda 可以看到时间戳
3 描述:想要让gcda文件生成在指定目录
场景:有时候是在机器A编译,机器B运行,这种情况就会不能生成gcda文件,提示找不到目录
解决:gcov的交叉编译
操作如下:
- vim /etc/profile 进行配置
export GCOV_PREFIX="/data/ad_server/ad_server.dir" //gcda的目标路径
export GCOV_PREFIX_STRIP= //向上数你的路径到需要配置的那个 比如我的编译路径是/data/code/adserver//////*.gcno,我就设置了9,应该也可以设置export GCOV_PREFIX_STRIP=999等很大然后配置全路径,我没试- source /etc/profile 使其生效
- 重启服务进程
- 执行测试代码,exit()退出,查看profile的设置路径,已经有gcda文件
- 拷贝gcno文件到gcda路径,统计代码覆盖率
- blingbling的就大功告成了!
我的问题:配置了n久该路径一直不生效,最后要哭了。今天偶然发现需要重启进程,忧伤极了
4 描述:无法使用gcovr生成覆盖率--得到的覆盖率为0%
$gcovr -r .
------------------------------------------------------------------------------
GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File Lines Exec Cover Missing
------------------------------------------------------------------------------
------------------------------------------------------------------------------
TOTAL --%
------------------------------------------------------------------------------
解决:执行gcovr -r .在编译的大路径下即可
目录不对,只有gcda和gcno、cpp.o文件无法生成覆盖率,需要源码--猜测
需要在编译路径下生成,拷贝编译路径下所有文件到一个新文件夹,也不能生成覆盖率,很忧伤,不知道为什么,烦知情热心人士告知,感激不尽。
【C++】统计代码覆盖率(二)的更多相关文章
- nyist 240 小明的调查统计(二)
http://acm.nyist.net/JudgeOnline/problem.php?pid=240 小明的调查统计(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:1 ...
- Jacoco远程统计代码覆盖率
Jacoco 什么是Jacoco? Jacoco是一个开源的Java代码覆盖率工具,Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAg ...
- jacoco+ant安装部署篇(统计代码覆盖率,适用自动化测试)
1:什么是jacoco? JaCoCo是一个开源的覆盖率工具(官网地址:http://www.eclemma.org/JaCoCo/),它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant. ...
- Python实现C代码统计工具(二)
目录 Python实现C代码统计工具(二) 声明 一. 问题提出 二. 代码实现 三. 效果验证 Python实现C代码统计工具(二) 标签: Python 代码统计 声明 本文将对<Pytho ...
- 统计无符号整数二进制中1的个数(Hamming weight)
1.问题来源 之所以来记录这个问题的解法,是因为在在线编程中经常遇到,比如编程之美和京东的校招笔试以及很多其他公司都累此不疲的出这个考题.看似简单的问题,背后却隐藏着很多精妙的解法.查找网上资料,才知 ...
- PHP实现站点pv,uv统计(二)
数据采集脚本如下: error_reporting(0);date_default_timezone_set("PRC");$environment = get_cfg_var(' ...
- 【C++】统计代码覆盖率(三)
报告集成到jenkins才是最终目的,因此又进行了部分资料查找,得到html和xml报告集成jenkins的配置如下: 一 集成html报告 这种方式集成在你已经用gcov+lcov生成了html报告 ...
- 【C++】非原创|统计代码覆盖率(一:C++)
也是转别人的,因为我c++好菜好菜啊... http://blog.chinaunix.net/uid-23741326-id-3316943.html c++跟C基本是一样的,统计覆盖率,需要生成g ...
- SQLServer 行转列,统计,二次分组
create table test ( bizdate datetime, --日期 classes varchar(50), --班次 '白班' 或 '夜班' qty int --产量 ...
随机推荐
- HtmlAgilityPackage XPath学习
最近的开发中要用到htmlAgilityPackage, 所以记录一下XPath相关知识! XPath 简介 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对 ...
- C# windows 服务编写及安装
最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作不成功,可能是开发环境或项目配置的不同,这里 ...
- swift:入门知识之枚举和结构体
枚举: swift中的枚举有些类似于类这个概念,它有自己的属性,也可以有自己的方法 枚举中的成员有原始值和实际值之分,原始值用来枚举成员的排序次序,默认从0开始 枚举出来的成员值就是实际值 可以通过t ...
- 3、Object对象的两大方法(hashCode-equals)总结
Object类是所有java类的父类. 用户定义了如下一个Person类 public class Person{} 在类定义中并没有明确继承Object类,但是编译器会自动的完成这个过程. 既然所有 ...
- z-index无效问题的解决方法
在使用z-index这个属性之前,我们必须先了解使用z-index的必要条件: 1.要想给元素设置z-index样式,必须先让它变成定位元素,说的明白一点,就是要给元素设置一个postion:rela ...
- 安卓自动化测试之MonkeyRunner环境的搭建
最近在抽时间学习一些安卓自动化的知识,把学到东西都就记录下来,避免以后记性不好忘记,也方便对自己积累知识的查阅 MonkeyRunner是基于坐标点来操作控件的,你可以通过写python脚本来调用mo ...
- POJ-3669 Meteor Shower(bfs)
http://poj.org/problem?id=3669 注意理解题意:有m颗行星将会落在方格中(第一象限),第i颗行星在ti时间会摧毁(xi,yi)这个点和四周相邻的点,一个人开始在原点,然后只 ...
- eclipse ADT下载地址
adt not vpn https://dl.google.com/android/eclipse/ 或 https://dl-ssl.google.com/android/eclipse/ andr ...
- org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.
2011-08-16 13:26:58,484 [http-8080-1] ERROR [core.web.ExceptionInterceptor] - org.codehaus.jackson.m ...
- HDU 3448 Bag Problem
这是一道搜索的背包题目 题意: 有n件物品从中最多选m件,使其总重量不超过v,求能获得的最大重量 有一个很重要的剪枝(是数据的问题还是这个剪枝本身很高效?): 如果重量最大m件物品都不超过v,则答案就 ...