嵌入式航天软件汇编代码覆盖测试方案*

2017-11-21 04:23马云云王金波瞿跃龙
航天控制 2017年5期
关键词:插桩测系统覆盖率

马云云 张 弛 王金波 瞿跃龙

中国科学院空间应用工程与技术中心,北京100094

嵌入式航天软件汇编代码覆盖测试方案*

马云云 张 弛 王金波 瞿跃龙

中国科学院空间应用工程与技术中心,北京100094

从插桩策略、覆盖率收集方法2个方面设计实现了一种汇编代码覆盖测试方案,解决了嵌入式航天软件汇编代码覆盖测试没有工具支持的问题。针对嵌入式系统资源紧张、时序相关性强的特点,在研究汇编语言指令结构的基础上,制定了一套基于比特位表征方式的汇编插桩策略;提出了一种基于JTAG接口的通用覆盖率数据收集方案,解决了覆盖信息输出通道受限问题。实验结果及工程应用实例证明了方案的有效性和可行性。

覆盖测试;软件测试;嵌入式软件;代码插装

覆盖测试是软件白盒测试的主要方法,覆盖测试不仅能发现被测程序的逻辑结构异常等缺陷信息,更是检验软件测试充分性,保证测试质量的有效方法之一。在高可靠软件应用领域,DO-178B和EN50128 等安全性标准对软件测试的覆盖率进行了详细的要求;在国内航空航天、轨道交通等高可靠领域,对软件代码覆盖率也有明确要求,通常至少应达到代码语句、分支100%覆盖的要求。

嵌入式航天软件中,汇编与C语言混合编程的方式较为普遍,但目前大多数覆盖率测试工具针对的是C/C++等高级语言,针对汇编语言的工具相当少见[1],因而在实际评测过程中,经常导致没有商业测试工具支持而无法对汇编代码进行覆盖测试。因此,设计一套通用的汇编代码覆盖测试方案,解决现有测试平台对汇编覆盖测试支撑不足的问题,已成为当前航天软件评测亟需解决的问题。

本文在研究汇编语言指令结构的基础上,结合嵌入式航天软件特点,设计实现了一种嵌入式汇编软件覆盖测试方案。

1 汇编覆盖测试现状

汇编语言是一种结构化较弱的程序设计语言,可能出现多入口和多出口的情况,这些特点决定了对其进行覆盖测试相当困难。虽然在我国航天型号嵌入式软件覆盖测试方面取得了一定的成绩[2],但对于汇编代码覆盖测试仍常出现没有商业工具支持,导致测试工作充分性没有客观评价和必要质量保证的情况。

目前,商业覆盖率收集测试平台主要有Testbed, Logiscope,CodeTest,Cantata,CuttleITE,BullseyeCoverage,PureCoverage和GCOV等,上述测试平台支持对象主要集中在C/C++语言代码编程的软件系统。而对于汇编代码,由于其与硬件具有极高的耦合度,不同的嵌入式平台汇编指令集各不相同等原因,工具可支持的汇编指令集非常稀少。

针对汇编代码覆盖测试少有工具支持的现状,文献[3]提出一种基于主机的嵌入式汇编插桩技术,以序列块为基本插桩单元,一定程度上降低了代码的膨胀率;文献[4]基于Intel8051指令系统,设计实现了一种虚拟插桩方案,利用仿真器断点机制抛出程序桩点信息,解决某些嵌入式软件中不易进行程序插桩的问题,这一方案主要适用于实时性要求不高的被测系统,对于实时性要求苛刻的高可靠控制领域,如航空、航天领域控制软件,由于断点处理过程耗时长,易破坏被测系统接口时序关系,导致功能行为失真,甚至无法进入预期功能分支。文献[5]提出了一种利用Gcov工具进行汇编覆盖测试的方案,并在X86平台进行了原型验证,这一方案的适用场景并未考虑嵌入式系统平台资源紧张(内存不丰富、可用IO通道少)、时序相关性强的特点[6],且对于没有文件系统的嵌入式系统生成覆盖数据文件是非常困难。

在实时性要求高的嵌入式航天软件领域,需要一个资源、时序开销小且相对通用的汇编代码覆盖测试方案,解决嵌入式汇编软件难于插桩、覆盖率数据输出通道受限等问题。

2 汇编代码覆盖测试方案

在研究汇编语言指令结构的基础上,针对嵌入式平台资源紧张、时序相关性强的特点,从插桩策略和覆盖率收集方法两方面设计实现了一套汇编覆盖测试方案,具体实施框架如图1所示。

图1 嵌入式汇编代码覆盖测试框架

在上位机中,采用基于比特位表征方式的汇编插桩策略完成代码插桩;在被测系统上运行插桩后的代码,并对产生的桩点数据进行暂存;利用硬件仿真器JTAG接口建立集成开发环境与目标CPU之间的硬件实时通信通道,进行覆盖率信息收集,在集成开发环境中接收查看覆盖率信息,进行覆盖分析。

2.1 程序插桩策略

程序插桩是实现覆盖测试的关键技术之一,目前大多数覆盖测试工具均采用代码插桩技术。传统的插桩策略是在所有需要插桩的位置插入探针,在程序运行过程中收集所有可能用到的程序信息,但这种策略插桩开销过大,无法满足嵌入式系统覆盖测试需要。针对上述问题,许多研究学者提出了一些插桩策略及改进方法来降低插桩开销[7-10],但这些方法的研究对象主要针对高级语言代码,并未考虑嵌入式汇编代码的特殊性。

针对汇编程序语句、分支覆盖测试实际情况,本文从桩点信息表征方式、桩点插入规则和桩点输出函数实现3个方面对插桩策略进行具体介绍。

2.1.1 桩点信息表征方式

对于桩点数据采用按比特位表征的方式,使得桩点数据在存储空间、数据输出时间方面开销尽可能小,以适应嵌入式系统存储资源匮乏、时序紧张的特点。

具体的,每个桩点以{桩点ID、桩点状态}方式唯一表征,其中:

桩点ID:代表被覆盖语句分支在代码中的具体位置。桩点ID编号时,考虑到汇编程序中往往采用很多条件和无条件跳转指令,结构复杂,若按照执行顺行对桩点ID进行编号,易出现插桩遗漏情况。本文以源代码行号前后次序进行编号,假设源代码共需插桩n个,则桩点ID按照0,1,2,…,n-1进行编号。对于收集语句覆盖率的情况,同一源文件中桩点直接按照源代码先后顺序进行编号;对于需要收集分支的情况,按照真分支桩点编号为X,假分支编号为X+1的规则进行编号。

桩点状态:代表桩点的覆盖情况,采用基于比特位方式表征,0代表未覆盖,1代表已覆盖。每个桩点在内存空间中仅占用1比特,对于同一桩点信息多次被执行的情况,不会额外增加存储空间,均可通过对应比特位取值表征该桩点是否在测试过程中运行到。采用这种设计思路,可以大大降低覆盖率信息对存储空间的占用以及桩点数据传输对接口时序造成的不良影响。例如,对于语句分支桩点个数为200的汇编代码,仅需要25个字节即可存储全部桩点的覆盖信息。

2.1.2 桩点插入规则

通过分析汇编代码结构特征,应在以下几个特征位置进行插装:条件判断语句、直接跳转语句、条件跳转、宏定义和标号内代码。

在桩点插入过程中,以源代码行号前后次序在上述位置按照具体插桩策略进行,保证在顺序执行的语句块的第一条语句前和最后一条语句前均进行插桩,且每一个条件判断的真假分支均有唯一桩点信息对应。具体桩点插入过程可利用程序自动完成,对于代码量少的情况也可手动插入,具体方式可视实际情况而定。下面具体介绍插桩规则。

1)条件判断语句

对于条件判断语句,应在该语句之前对条件真假分支分别插入桩点,见表1。

表1 条件判断语句插桩

表1中,桩点(x)反映该条件判断的TRUE分支覆盖情况;桩点(x+1)反映该条件判断的FALSE分支覆盖情况。

此外,由于桩点(x)及(x+1)插入位置也是条件判断语句之前的上一程序基本块的结束位置,因此桩点(x)及(x+1)也同时反映了上一程序基本块的覆盖情况。

2)无条件转移指令

无条件转移指令包含直接跳转语句、子程序调用指令等,对于这类指令应在无条件转移指令前、后分别设置桩点。

表2 无条件转移指令插桩

表2中,桩点(x)反映转移语句之前顺序执行的代码段的语句覆盖情况,桩点(x+1)反映插入点后的下一个顺序执行的代码段的语句覆盖情况。

3)条件转移指令

条件转移语句应在条件跳转前后分别设置反映条件判断真、假分支覆盖情况的桩点,插桩方式如表3。

表3 条件转移指令插桩

表3中,桩点(x)反映该条件判断的TRUE分支覆盖及上一桩点至条件判断之间语句覆盖情况;桩点(x+1)反映该条件判断的FALSE分支以及后续语句的覆盖情况。

4)宏定义

宏定义代码,需要在宏定义代码开始处、结束处插桩,内部语句插桩方式与外部汇编代码插桩方式类似。

5)标号

由于标号内代码可能是顺序执行地址或跳转后执行地址,也可能是子程序入口地址或宏调用入口。因此对于标号内代码需在标号内代码执行开始位置、结束位置设置桩点。对于标号是子程序入口地址的情况,结束位置为子程序返回指令前;标号不是子程序入口地址的情况,结束位置为下一个标号开始前。标号内代码与基本汇编代码插桩方式类似,需在条件判断处、跳转处设置桩点。

2.1.3 桩点输出函数实现

嵌入式航天软件的汇编代码具有体量小但安全关键程度较高的特点。因此,桩点数量与高级语言编写的代码相比非常少,桩点覆盖信息采用按比特位方式表示后,桩点覆盖信息所需占用存储空间则更少。

鉴于以上特点,在桩点输出函数设计时,将桩点覆盖数据输出至被测系统内部空闲存储空间存储,当接收到覆盖数据回传控制命令时,才将覆盖数据输出至系统外。此外,还应尽可能降低桩点输出对被测软件时间特性、时序关系的影响。桩点输出函数实现流程分为如下5步:

Step1:为桩点信息分配内存空间,并初始化为未覆盖状态;

Step2:寄存器压栈处理;

Step3:根据桩点编号计算桩点存储位置;

Step4:将存储位置对应的比特位置为已覆盖状态;

Step5:寄存器出栈处理。

以TMS320C6000系列DSP运行平台为例,给出插桩函数实现示例如下:

OUT_PUT .macro ID;也可定义为子程序

……;寄存器压栈处理

mvkl OUTPUT_ADDR,a7

mvkh OUTPUT_ADDR,a7

mv ID,a3

nop 5

shr a3, 0x03, b0

clr a3,3,15, a2

add a7, b0, a7

nop 5

mvk 0x01,a8

shl a8, a2, a8

ldb *a7,b8

nop 5

or b8,a8,b8

stb b8,*a7

nop 5

……;寄存器出栈处理

.endm

其中,OUTPUT_ADDR为事先定义的覆盖率数据信息存储起始地址,ID号为桩点ID。

2.2 覆盖率信息收集

目前,嵌入式系统覆盖率数据收集过程中常遇到以下难题:1)被测系统上既有接口类型受限;2)覆盖率数据接收设备的接收处理能力不足。实时嵌入式软件桩点输出量大,若采用低速通信方式,常无法满足时序要求,导致系统功能行为失真;若采用高速接口,则需要专用高速覆盖率接收设备。

为了摆脱对覆盖率数据专用接收设备的依赖,并克服被测系统常无可用输出通道的问题,需要采用一种相对通用的覆盖率数据输出方式,并减轻高速、大数据量桩点传输对被测系统功能行为的影响。通过对主流嵌入式系统平台调研,目前多数高级器件都支持JTAG协议,如DSP,FPGA,ARM和部分单片机器件等, 并且JTAG在测试信号完整性和嵌入式在线仿真方面都有很好的应用。

本文利用嵌入式在线仿真器与被测目标板JTAG口连接,建立集成开发环境与目标CPU的硬件实时通信通道,将被测系统动态运行过程中产生的桩点数据通过JTAG接口输出至系统外部,由集成开发环境所在上位机接收。

下面以TI公司的DSP处理器为例,给出具体的覆盖率数据收集方案,见图2。

图2 覆盖率数据收集方案

被测代码插桩后,下载至嵌入式平台运行;产生的桩点数据直接存储在被测系统内部;在CCS(Code Composer Studio)集成开发环境中进行覆盖率信息回传控制,需要回传覆盖率数据时暂停或停止被测件运行,利用GEL(General Extended Language,即通用扩展语言)函数GEL_MemorySave()访问被测系统内部存储空间,将暂存的覆盖率数据通过JTAG接口传回至集成开发环境所在上位机,并将覆盖率数据保存为数据文件。

3 实验结果

在TMS320C6000系统嵌入式运行平台上,以某星载软件汇编代码为实验对象,搭建实验平台如图3所示。

图3 汇编代码覆盖测试实验平台

(1)运行时间开销

为了验证本文方案在运行时间开销方面性能,分别对未插桩星载软件运行时间、插桩后软件采用传统桩点数据传输方案运行时间、本文方案运行时间进行对比测试。其中,传统桩点数据传输方案使用被测目标板上SPI接口将桩点数据逐一输出。

本实验中程序运行时间统计方法为:使用DSP芯片定时器Timer0的计数器值(CNT)对程序运行时间进行计时,计时精度为0.02μs。在程序开始时,设置计数器周期寄存器为上限值,以保证统计期间不会发生溢出,通过在程序运行开始处设置控制寄存器来启动计时,在程序运行结束处读取计数器值,得出代码运行的时间。

实验过程中,选取相同测试用例(均使被测软件执行201984个桩点函数),得到运行时间结果如表4。

表4 运行时间开销对比

(2)动态桩点数据存储开销

为了验证本文方案在存储资源开销方面性能,选取以下3段程序进行实验:

程序1:有限次循环程序;

程序2:单次执行程序;

程序3:无限循环程序。

为了便于定量对比,上述程序中均仅保留一个桩点,分别采用本文方案、传统方案执行相同测试用例,产生的动态桩点数据量统计如表5。

表5 动态桩点数据存储开销对比

通过上述实验数据可知,本文方案相对于桩点数据直接传输方案,在程序运行时间开销方面下降97.5%;在动态桩点数据存储开销方面下降幅度超过96.8%,且桩点数量越多时,存储开销下降幅度越大。

实验结果表明,本文的插桩策略和覆盖率收集方法相对传统方案在降低对嵌入式软件时序影响和减少资源开销方面的性能大大提升。

此外,本文方案已成功应用于某星载软件评测工程项目,取得良好应用效果:在没有商业工具支持的情况下,完成了覆盖测试,且被测代码语句、分支覆盖率均达到100%。

4 结束语

设计实现了一种嵌入式汇编代码覆盖测试方案,提出了基于比特位表征方式的汇编插桩策略和基于JTAG接口的通用覆盖率数据收集方案,解决了汇编覆盖测试中插桩开销大、覆盖信息输出通道受限等问题。实验结果及工程应用效果表明本文方案在时间性能、存储开销及通用性等方面相对传统方案均有显著优势。为嵌入式汇编代码覆盖测试常无法开展的问题提供了一种新的解决方法,下一步还需要对不同汇编指令集的通用自动插桩方法进行研究。

[1] 唐科,向渝,罗光春.汇编程序覆盖测试中分支路径数的计算[J].电子科技大学学报,2005,34(2): 235-239.(Tang Ke, Xiang Yu, Luo Guangchun, et al. An Algorithm for Calculating the Branch Routes of an Assembly Program in Software Coverage Testing [J]. Journal of UEST of China, 2005, 34(2): 235-239.)

[2] 张波.基于测试覆盖的安全关键软件测试策略研究[D]. 长春:中国科学院长春光学精密机械与物理研究所,2012.(Zhang Bo. A Study of Strategies about Testing Safety Critical Software Based on Testing Coverage [D]. Changchun: Changchun Institute of Optics, Fine Mechanics and Physics, Chinese Academy of Sciences, China, 2012.)

[3] Dong Ting ,Wang Zhongmin. Research on Instrumentation Technology for the Embedded Assembly Software Testing Based on Host Computer [C]// 2011 International Conference on Computer Science and Network Technology, Harbin,China, 2011. IEEE Press, 2011,3:1906-1909.

[4] 王学东,汪文勇.汇编程序覆盖测试中虚拟插桩的实现[J].计算机工程, 2007, 33(7): 87-88.(Wang Xuedong, Wang Wenyong. Implementation of Virtual Instrumentation in Coverage Test of Assembly Code [J]. Computer Engineering, 2007, 33(7): 87-88.)

[5] 费训,罗蕾. 利用GNU工具实现汇编程序覆盖测试[J].计算机应用, 2004, 24(12): 95-98.(Fei Xun, Luo Lei. Implementation of Assembler Program Coverage Testing with GNU Tool [J]. Computer Applications, 2004, 24(12): 95-98.)

[6] 丁旭,崔吉岗,刘春裕.军用嵌入式软件结构覆盖测试技术[J]. 指挥控制与仿真, 2008, 30(3): 120-122.(Ding Xu, Cui Jigang, Liu Chunyu. Test Technology of Procedure Structure Cover for Military Embedded Software [J]. Command Control & Simulation, 2008,30(3): 120-122.)

[7] Pankumhang T, Rutherford M J. Iterative Instrumentation for Code Coverage in Time-Sensitive Systems[C]//IEEE. International Conference on Software Testing, Verification and Validation.Graz,Austria,April,2015.IEEE Press,2015:1-10.

[8] 郭锐,李博,彭宝新. 用于覆盖测试的代码插桩程序设计与实现[J].科学技术与工程, 2013, 13(30): 9073-9077.(Guo Rui, Li Bo, Peng Baoxin. Design and Implementation of Instrumentor for Coverage Testing [J]. Science Technology and Engineering, 2013, 13(30): 9073-9077.)

[9] Fischmeister S, Lam P. Time-Aware Instrumentation of Embedded Software[J]. IEEE Transactions on Industrial Informatics, 2010, 6(4): 652-663.

[10] Arnold M, Ryder B G. A Framework for Reducing the Cost of Instrumented Code[J].Acm Sigplan Notices, 2003, 36(5): 168-179.

NovelAssembly-LanguageCodeCoverageTestingSchemeforEmbeddedAerospaceSoftware

Ma Yunyun, Zhang Chi, Wang Jinbo, Qu Yuelong

Technology and Engineering Center for Space Utilization, Chinese Academy of Science, Beijing 100094, China

Aneffectiveassembly-languagecodecoveragetestingschemeisdesignedandimplementedtosolvetheproblemthatthereisoftennoavailabletoolsupportsassembly-languagecodecoveragetestingintheaerospaceembeddedsystem.Thisschemeconsistsoftwopartsbycodeinstrumentationstrategyandcoveragedatacollectionmethod.Inviewofthecharacteristicsofembeddedsystem,suchasstricttimingrequirementandlimitedmemoryresources,acodeinstrumentationmethodwithbitbasedcoveragestateinformationexpressionstrategyisproposedonthebasisofresearchonassemblyinstructionstructure,andthenageneralassemblycoverageinformationcollectionmethodbyusingJTAGinterfaceisproposedtosolvetheproblemoflimitedcoverageoutputchannelinembeddedsystem.Theexperimentalresultsandengineeringpracticeshowsthattheschemegivenisfeasibleanduseful.

Coveragetesting;Softwaretesting;Embeddedsoftware;Codeinstrumentation

TP311

A

1006-3242(2017)05-0068-06

*载人航天国家重大专项(Y6140511RN)

2017-03-24

马云云(1982-),女,山东人,硕士, 工程师,研究领域为高可靠软件、嵌入式软件评测;张弛(1990-),男,山东人,硕士, 助理工程师,研究领域为高可靠软件、嵌入式软件评测;王金波(1979-),男,江苏人,博士,副研究员,研究领域为高可靠软件;瞿跃龙(1972-),男,云南人,本科,高级工程师,研究领域为高可靠软件、嵌入式软件评测。

猜你喜欢
插桩测系统覆盖率
民政部等16部门:到2025年村级综合服务设施覆盖率超80%
我国全面实施种业振兴行动 农作物良种覆盖率超过96%
基于TXL的源代码插桩技术研究
基于性能分析的自适应插桩框架
基于记录重播的嵌入式系统死锁检测方法
基于喷丸随机模型的表面覆盖率计算方法
防洪非工程措施设计实例——嘉兴市水文巡测系统项目设计
电快速瞬变脉冲群对核测系统的影响及对策
基于广域量测系统的电力系统综合负荷辨识模型的研究
三维标测系统指导下射频消融治疗房颤的护理观察