嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导
在嵌入式平台上使用了gtest白盒测试工具,覆盖了被测函数,但是不知道自己测试的效果如何,测试行覆盖率、函数覆盖率,分支覆盖率的数据。
便开始研究gcov这个代码覆盖率工具能否使用,来检查白盒测试的效果,以及指引测试改进的方向。经过多次尝试和研究,
在嵌入式平台上可以使用gcov这个工具,不过操作稍微复杂点。
环境要求:
1、有被测组件的源代码
2、对应平台的交叉编译器必须包含gcov功能
3、安装好lcov工具
4、相应的嵌入式设备
使用gcov/lcov测试代码覆盖率,总共分为四步:
1、在组件编译中添加gcov编译参数,然后编译debug版本,同时生成gcno文件
2、在gtest编译中使用添加编译参数的组件
3、执行生成的程序,生成代码覆盖文件gcda
4、使用lcov工具解析gcno和gcda文件,生成html报表文件
下面详细说明四个步骤如何操作:
1、在组件编译中添加编译参数
我们测试的是组件,文件形式是静态库(.a)或者动态库(.so)。为了统计测试的代码覆盖率,我们需要在编译的时候添加如下参数。
需要添加的编译参数为:-fprofile-arcs -ftest-coverage;同时添加参数对应的库lgcov
添加完成后,进行编译。然后查找,找到生成的后缀名为gcno文件的话,则说明成功。
重要:gcno文件生成的路径,这个一般是根据Makefile脚本指定的不同路径来确定的,有的时候与源代码在一起,有的时候与中间文件在一起。
但是不管gcno的路径在哪里,要记住这个路径。后续有用的。
2、在gtest编译中使用带gcov的组件
A、修改编译脚本,添加-lgcov 编译参数
B、把使用的库文件替换为添加gcov编译参数的组件
(如何在嵌入式平台中使用gtest,请参考 http://www.cnblogs.com/StitchSun/p/4430362.html)
3、执行gtest测试程序
把编译好的测试程序在对应的设备上执行测试,执行没有错误后,然后查看嵌入式设备的目录,到与生成gcno路径一致的目录下,查找gcda文件
gcda文件生成路径为编译时生成gcno的路径,不过gcno是在编译服务器上,gcda是在程序运行的嵌入式设备上。
4、使用lcov解析gcda和gcno文件
把设备的gcda文件下载到编译服务器,同时把编译时生成的gcno文件也复制到同一个目录。
对于前面名称相同的文件,gcda和gcno文件必须在同一目录下。
要使用lcov工具,可以在http://ltp.sourceforge.net/coverage/lcov.php 下载最新的版本。
但是这个工具无法直接解析嵌入式平台产生的gcno和gcda格式的文件,需要修改一个地方。
即这个工具默认的是使用linux系统自带的gcov,需要修改为使用交叉编译器的gcov工具。
修改的文件为:bin/geninfo 的,把原来的gcov修改为交叉编译的gcov。
修改完成,保存退出。
以使用的isi3518 交叉编译器为例,执行下面的命令:
a /opt/lcov_test/hisi3518/lcov-1.9/bin/lcov -d . -t 'test' -o 'test.info' -b . -c
b /opt/lcov_test/hisi3518/lcov-1.9/bin/genhtml -o result test.info
看到上面的提示,说明执行成功了。把result文件夹下载到windows上,打开里面的index,就可以看到结果了。
常见问题:
1、geninfo: ERROR: …: reached unexpected end of file
注意,lcov 最好使用 1.9 及以上版本,否则可能遇到如下错误:
geninfo: ERROR: …: reached unexpected end of file
2、 gcov解决stamp mismatch with graph file
使用 hexdump -e '"%x\n"' -s8 -n4 命令分别解析 XXX.gcno和XXX.gcda文件
如果生成的码不一致,则说明gcno和gcda不是一次编译生成的,需要重新编译。
命令使用如下:
hexdump -e '"%x\n"' -s8 -n4 dns_shell.gcno
3、找不到源代码
在解析gcno和gcda时,要和源代码在一个服务器上,并且源代码的路径在生成gcno和gcda后
没有变动过。不然会提示找不到源代码。
参考:
在研究中,下面的链接有很大的帮助。表示感谢。
http://blog.sina.com.cn/s/blog_7e4ac8b501018b27.html
这个参考中的第三步 gcov产生报告信息: test.c.gcov 不用执行
嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导的更多相关文章
- 嵌入式平台使用gtest进行白盒测试
看了coderzh大神写的gtest(http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html)使用的帖子,觉得gtest这个工具比 ...
- GCOV&LCOV&GCOVR入门
索引 一.概述 二.关于gcov的安装 三.代码覆盖率测试(以GCOV为例) 1.编译源代码 2.运行可执行程序 3.通过gcov指令生成代码覆盖率报告 四.生成更全面.直观的代码覆盖率报告 1.LC ...
- 【转】gcov lcov 覆盖c/c++项目入门
原文: http://www.cnblogs.com/turtle-fly/archive/2013/01/09/2851474.html ------------------------------ ...
- Agile.Net 组件式开发平台 - 组件开发示例
所谓组件式开发平台,它所有的功能模块都是以组件的形式扩展的,下面我来演示一个简单的组件开发例程. Agile.Net开发管理平台项目,已经托管在开源中国码云平台(http://git.oschina. ...
- QT4.8.5环境移植到嵌入式平台
QT4.8.5环境移植到嵌入式平台 参考:Qt移植到ARM Linux教程 http://www.veryarm.com/930.html 清除配置: sudo make confclean 配置: ...
- 嵌入式平台选择:树莓派 or BeagleBone Black(BBB)
原文链接: Michael Leonard 翻译: 极客范- 小道空空 译文链接: http://www.geekfan.net/5246/ 嵌入式平台选择:树莓派 or BeagleBone Bla ...
- (转)gcov、lcov与genhtml 使用心得
gcc是linux平台下的C.C++ 编译器 gcov是配合gcc产生覆盖信息报告的工具: lcov是将gcov产生的报告信息,以更直观的方式显示出来工具 基本的使用方法分为4个阶段: (一).gcc ...
- Eclipse C++,Cygwin 64,gcov,lcov 单体&覆盖率测试环境搭建笔记
1.下载并安装 Eclipse IDE for C/C++ Developers https://eclipse.org/downloads/packages/eclipse-ide-cc-devel ...
- 迅为7寸工业触摸屏嵌入式平台可用于ARM嵌入式一体机
7寸触摸屏介绍产品名称:7寸IPS高清屏幕分辨率:1280*800触摸屏类型:电容屏(五点触摸)接线方式: FPC 可应用于嵌入式一体机.自动售货机.广告机.智能自动终端.零售终端等 ARM平台处理器 ...
随机推荐
- 单光纤udp通信
环境: 两块板子,拥有独立系统(Linux),通过单光纤连接(数据只能单向发送,无反馈).两块板子采用udp协议通信. 问题: 发送板子发送数据后,接收板子上的进程收不到数据. 确认两块光纤 ...
- C++ 常见容器
迭代器. 基本介绍(来源于网络):迭代器是一种抽象的概念.能够遍历容器内的 部分/全部 元素.每个迭代器中包含着元素的地址. 它可以将 抽象容器 和 泛型算法 结合起来. 大致原理: 1)迭代器 ...
- CentOS minimal版安装图形界面的步骤(自动获取IP)
1.连接网络: CentOS minimal.iso安装好后,进入终端,默认是不开网络的, 首先启用网卡, 自动获取ip. ifconfig eth0 up www.2cto.com dhcli ...
- Python之路第十天,高级(2)-多线程,多进程,协程
线程 threading threading模块对象 描述 Thread 表示一个线程的执行对象 Lock 锁原语对象 RLock 可重入锁对象,使单线程可再次获得已经获得了的锁(递归锁定) Cond ...
- Windows下使用TensorFlow
上一篇日志(http://www.cnblogs.com/huidong/p/5426556.html)写了如何在Windows下安装Docker,并且在VM上安装TensorFlow. 在Windo ...
- LFS,编译自己的Linux系统 - 前言
近期工作计划:1. 上班时,用Django编写一个网站:2. 下班时,用C#.WPF编写一个单机版应用软件:3. 其他时间,根据LFS编译自己的Linux系统. LFS是一本书,书中列出了从零开始编译 ...
- JVM的生命周期——JVM之二
一.首先分析两个概念 JVM实例和JVM执行引擎实例 (1)JVM实例对应了一个独立运行的java程序——进程级别 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程 ...
- Qt之QTemporaryFile(文件名唯一,且可以自动删除)
简述 QTemporaryFile类是操作临时文件的I/O设备. QTemporaryFile用于安全地创建一个独一无二的临时文件.临时文件通过调用open()来创建,并且名称是唯一的(即:保证不覆盖 ...
- [置顶] Oracle GoldenGate 系列:使用 Oracle ASM API DBLOGREADER 时遇 ora-01031 错误
今天在自己新搭建的 Oracle ACFS 文件系统上测试 GoldenGate ,启动 extract 进程报如下错误: 2013-08-27 14:58:39 ERROR OGG-00446 ...
- Linux 备份工具
Linux 备份工具 GNU 的传统备份工具 GNU tar — http://www.gnu.org/software/tar/ GNU cpio — http://www.gnu.org/so ...