嵌入式平台组件白盒测试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  不用执行

时间: 2024-12-18 20:55:48

嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导的相关文章

在云计算资源池上自动部署业务应用的大数据平台组件开发实战

在云计算提供的分布式资源池构建能够自动部署业务应用的平台组件,该平台组件能够非常简易的被众多的并发终端使用,从而轻而易举的提供业务支持: 尤其是值得注意的是,如果有需要的话,我们的不同业务组件和业务本身可以发生数据和资源的共享,这对于资源和数据的复用,尤其是对于效率的提升是至关重要的.         课程介绍   基于“在资源池上自动部署业务应用的平台组件”的要求,课程包含Spark的架构设计.Spark编程模型.Spark内核框架源码剖析.Spark的广播变量与累加器.Shark的原理和使用

《ARM 嵌入式系统编程与优化》之 Linux/ARM 嵌入式平台

Linux/ARM 嵌入式平台是<ARM 嵌入式系统编程与优化>的第一章. 好好学学硬件,然后深入一下 Linux,修炼好自己的内功. ARM 处理器不是独立芯片产品,而是具有多样性和异质性嵌入式片上系统(SOC)的集成部件,是可以针对各种特定产品实现定制化的部件. 除了处理器内核外,典型的片上系统还包含: 一系列不同的存储接口(例如同步动态随机存储器.闪存等) 通信接口(USB.蓝牙.WiFi 等) 图形.视频专用处理器(例如图形处理单元,GPU) ARM 处理器包含了片上系统的“计算”部分

Openshift平台组件监控

Openshift平台组件监控 Docker Docker 是Openshift最基本的组件. 需要master与node实例全局的docker健康情况 ,以下是每个节点应该监控的: Check Name Description Storage Driver Sample Alerting Logic Docker Daemon Check that docker is running on a system devicemapper systemctl is-active docker ove

QT嵌入式平台配置

Qt5 on ARM platforms - IntroductionQt5 ARM 平台移植#################################################### Introduction: This short post covers the background of Qt5, architec tural details, configuring for eglfs with Graphics drivers, building, and known i

iTOP-4412开发板-嵌入式平台开机测试

iTOP-4412平台硬件的连接1.核心板和底板的连接 迅为iTOP-4412开发板采用工业级进口板对板连接器,拔插方便稳定可靠,如下图所示. 另外迅为独家提供两种封装的核心板,接口定义完全兼容,如下图所示. iTOP-4412开发平台,核心板和底板可分离.拆分核心板的时候,使用塑料的薄片在核心和底板任意一边轻轻撬动,听到清脆的响声,表明撬动的一边的连接器已经分离,接着依次分离其它三边. 安装核心板的时候,核心板和底板的箭头要指向同一方向,将核心板和底板对齐,然后按压核心板,听到四次清脆的响声,

[misc]如何在嵌入式平台使用printf功能

转自:http://www.cnblogs.com/liu_xf/archive/2011/04/14/2015726.html 摘要: 当我们在调试代码时,通常需要将程序中的某个变量打印至PC机上,来判断我们的程序是否按预期的运行,printf函数很好的做到了这一点,它能直接以字符的方式输出变量名和变量的值,这样使输出的信息很直观:但printf函数在使用时,不仅仅要初始化串口,还需要其它的一些设置或者要调用其它的一些函数,否则printf函数将不能按我们想要的方式执行. 由于不同的编译器st

Eclipse C++,Cygwin 64,gcov,lcov 单体&amp;覆盖率测试环境搭建笔记

1.下载并安装 Eclipse IDE for C/C++ Developers https://eclipse.org/downloads/packages/eclipse-ide-cc-developers/lunasr1 2.下载并安装Cygwin https://www.cygwin.com/ 安装选择package的时候记得要选择gcc相关的所有 测试时使用到了boost,因此把boost相关的也装上 Devel下的包尽量都装一下. 3.下载并安装CDT gcov plugin htt

Netbeans配置Java SE嵌入式平台(树莓派)

1.配置平台 来源:http://www.cnblogs.com/xiaobo-Linux/p/7955769.html 2. 选择远程 3. 填写信息 JRE 路径是树莓派上的路径:how? sudo update-alternatives --display java 输出 java - auto mode link best version is /usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/bin/java link currently poi

从CMDB查询云平台组件或者IP简单脚本

#!/bin/bash#author xiaoweige#todo: ip -- > ingredient or ingredient -- > ip #todo: get the ip of the given ingredientfunction ingredient_ip() {#todo: get the ip of the ingredient given mysql -uroot -pengine -e "select * from ipandingredient.ipa