摘 要: 以研究對(duì)嵌入式系統(tǒng)魯棒性進(jìn)行評(píng)價(jià)和基于軟件故障注入技術(shù)的嵌入式系統(tǒng)魯棒性測(cè)試為目的。對(duì)嵌入式系統(tǒng)魯棒性測(cè)試的相關(guān)概念以及軟件故障注入技術(shù)原理進(jìn)行了介紹,,以Linux操作系統(tǒng)內(nèi)核函數(shù)測(cè)試為例,通過(guò)對(duì)系統(tǒng)API參數(shù)的故障注入接口進(jìn)行分析,,提出基于GDB工具的軟件故障注入方法來(lái)實(shí)現(xiàn)系統(tǒng)魯棒性故障注入測(cè)試,。完成了相應(yīng)的Linux操作系統(tǒng)API接口故障注入測(cè)試實(shí)例并給出了測(cè)試結(jié)果。為嵌入式系統(tǒng)魯棒性測(cè)試提供了更為直觀,、有效的方法,。
關(guān)鍵詞: 魯棒性; 故障注入,; 軟件測(cè)試,; 嵌入式系統(tǒng)
嵌入式系統(tǒng)由于其自身的特點(diǎn),在開(kāi)發(fā)和測(cè)試方面的難度往往大于通用軟件,。傳統(tǒng)的結(jié)構(gòu)化測(cè)試方法在測(cè)試系統(tǒng)魯棒性方面存在一些缺點(diǎn)[1],。故障注入方法作為傳統(tǒng)測(cè)試方法的一種補(bǔ)充,重點(diǎn)測(cè)試系統(tǒng)在異常條件和無(wú)效參數(shù)下容錯(cuò)應(yīng)對(duì)情況,。通過(guò)注入故障的方法來(lái)測(cè)評(píng)容錯(cuò)機(jī)制,、驗(yàn)證系統(tǒng)異常應(yīng)對(duì)能力,從而提高系統(tǒng)魯棒性,。其最大的特點(diǎn)是高度靈活性,,它既能通過(guò)特殊的硬件輔助設(shè)備進(jìn)行硬件方法的測(cè)試,也能實(shí)現(xiàn)軟件方法的故障注入測(cè)試,。
在嵌入式系統(tǒng)軟件測(cè)試方面,,故障注入技術(shù)可以對(duì)系統(tǒng)的容錯(cuò)性、可靠性,、安全性進(jìn)行測(cè)試,,既可以采用靜態(tài)故障注入的方式,也可以采用動(dòng)態(tài)故障注入的方式,。本文針對(duì)嵌入式系統(tǒng)的結(jié)構(gòu)特點(diǎn)和可靠性設(shè)計(jì),,利用嵌入式系統(tǒng)API,在OS接口以及應(yīng)用層實(shí)現(xiàn)軟件故障注入,,構(gòu)建軟件故障注入模型,。通過(guò)對(duì)注入故障后系統(tǒng)反饋數(shù)據(jù)的分析,可實(shí)現(xiàn)測(cè)試和評(píng)估容錯(cuò)機(jī)制的目標(biāo),,從而達(dá)到提高系統(tǒng)魯棒性的目的,。
1 嵌入式系統(tǒng)魯棒性測(cè)試簡(jiǎn)介
系統(tǒng)魯棒性是衡量系統(tǒng)在壓力環(huán)境或異常輸入下保持正常工作能力的一種度量[2],。嵌入式系統(tǒng)體系結(jié)構(gòu)從底層到頂部的順序依次是:內(nèi)核(包含內(nèi)核函數(shù))、系統(tǒng)調(diào)用,、內(nèi)建程序(操作系統(tǒng)的命令)[3],。內(nèi)核函數(shù)是內(nèi)核代碼的組成部分,其調(diào)用程序直接運(yùn)行在內(nèi)核空間,。內(nèi)核函數(shù)一旦出現(xiàn)異常,,將立刻對(duì)整個(gè)操作系統(tǒng)產(chǎn)生影響。實(shí)施嵌入式系統(tǒng)魯棒性測(cè)試的主要目的就是發(fā)現(xiàn)系統(tǒng)內(nèi)核的薄弱環(huán)節(jié),,并予以消除或增強(qiáng)抵抗異常情況的能力,,從而提高系統(tǒng)的魯棒性。
傳統(tǒng)的系統(tǒng)魯棒性測(cè)試方法是通過(guò)觀察系統(tǒng)的失效行為,,通過(guò)分析錯(cuò)誤記錄來(lái)完成的,。對(duì)一個(gè)高可靠系統(tǒng)而言,通過(guò)長(zhǎng)時(shí)間實(shí)際觀察來(lái)獲取有關(guān)統(tǒng)計(jì)結(jié)果不切實(shí)際,。嵌入式系統(tǒng)魯棒性測(cè)試關(guān)心的是系統(tǒng)失效的情況,,對(duì)于嵌入式系統(tǒng)魯棒性的評(píng)價(jià)一般有基于測(cè)量的方法和基于故障注入的方法[4]。測(cè)試的重點(diǎn)在于通過(guò)在內(nèi)核層面進(jìn)行故障注入,人為地使系統(tǒng)出現(xiàn)故障,,進(jìn)而對(duì)故障信息進(jìn)行分析,,最終根據(jù)測(cè)試結(jié)果生成相應(yīng)的保護(hù)代碼。
2 軟件故障注入技術(shù)概述
故障注入技術(shù)就是按照選定的故障模型,,用人工注入的方法有意識(shí)地產(chǎn)生故障并施加于運(yùn)行的目標(biāo)系統(tǒng)中,,達(dá)到加速該系統(tǒng)錯(cuò)誤和失效的產(chǎn)生,通過(guò)監(jiān)控并采集系統(tǒng)對(duì)注入故障的反饋信息和現(xiàn)場(chǎng)數(shù)據(jù),,通過(guò)分析提供有關(guān)結(jié)果的測(cè)試過(guò)程[5],。一般故障注入流程如圖1所示。
軟件故障注入技術(shù)是通過(guò)特定的程序?qū)ο到y(tǒng)軟件,、硬件錯(cuò)誤狀態(tài)進(jìn)行仿真,。這種方法容易測(cè)試出新的故障類(lèi)型。故障注入原理就是通過(guò)修改程序執(zhí)行語(yǔ)句,,增加,、修改、刪除數(shù)據(jù)或直接修改寄存器或存儲(chǔ)器的內(nèi)容來(lái)模擬硬件或軟件故障的發(fā)生,。軟件故障注入的目標(biāo)可以是應(yīng)用程序或操作系統(tǒng),。如果目標(biāo)為應(yīng)用程序,故障注入程序插入到應(yīng)用程序中或作為應(yīng)用程序和操作系統(tǒng)之間的一層,。如果目標(biāo)是操作系統(tǒng),,注入程序只能嵌入到操作系統(tǒng)中。
軟件實(shí)現(xiàn)的故障注入技術(shù)有以下三種:
(1) 修改程序的源代碼使其出現(xiàn)故障,通常用于變異測(cè)試,;
(2) 在執(zhí)行過(guò)程中修改程序某部分的數(shù)據(jù)狀態(tài),,通常用于故障行為研究;
(3) 基于壓力的故障注入,。即通過(guò)一定的工作負(fù)載來(lái)觸發(fā)系統(tǒng)容錯(cuò)行為,,驗(yàn)證系統(tǒng)容錯(cuò)機(jī)制。
軟件實(shí)現(xiàn)的故障注入投入低且易于控制,,無(wú)需額外的硬件設(shè)備,,可以在程序指令能夠訪問(wèn)到的軟硬件位置上自由選擇故障注入點(diǎn)。作為近年來(lái)新興實(shí)驗(yàn)技術(shù)手段,,軟件的故障注入方法有著成本低,、靈活度高、可再現(xiàn)性等優(yōu)點(diǎn)而被廣泛采用,。
3 嵌入式系統(tǒng)故障注入方法
嵌入式系統(tǒng)中用戶層與內(nèi)核的交互都需要通過(guò)系統(tǒng)接口API來(lái)實(shí)現(xiàn),所以對(duì)系統(tǒng)內(nèi)核的故障注入需要針對(duì)這些系統(tǒng)調(diào)用接口進(jìn)行[6],??刹捎们度胧较到y(tǒng)中的常用工具GDB進(jìn)行。GDB的全稱(chēng)是GNU Debuger,,是GNU開(kāi)源組織發(fā)布的一個(gè)強(qiáng)大的UNIX下的程序調(diào)試工具,。使用GDB工具可以讓被調(diào)試程序停止在任意一個(gè)位置。在程序停止時(shí),,可查看或修改程序內(nèi)存空間或寄存器的值,。GDB的功能可用于對(duì)被測(cè)試程序進(jìn)行故障注入,設(shè)置斷點(diǎn)進(jìn)行故障觸發(fā),,修改內(nèi)存和寄存器的值來(lái)進(jìn)行故障數(shù)據(jù)注入,,查看內(nèi)存和寄存器的值來(lái)回收故障數(shù)據(jù)等。
Ptrace()是GDB的基礎(chǔ)調(diào)試工具,,通過(guò)Ptrace()可以在一個(gè)進(jìn)程中觀察和控制另一個(gè)進(jìn)程的執(zhí)行狀態(tài),,主要用于執(zhí)行斷點(diǎn)調(diào)試和系統(tǒng)調(diào)用跟蹤。在嵌入式系統(tǒng)下,,可使用Ptrace()系統(tǒng)調(diào)用來(lái)進(jìn)行故障注入和故障數(shù)據(jù)采集,。Ptrace()的系統(tǒng)調(diào)用格式如下:
#include <sys/ptrace.h>
Long ptrace(enum_ptrace_request request, pid_t pid, void *addr, void *data)
參數(shù)pid表示進(jìn)程號(hào),request表示具體操作,,data表示要注入的數(shù)據(jù),,addr指明地址。在進(jìn)行具體的故障注入時(shí),,需要控制運(yùn)行的進(jìn)程,,并對(duì)進(jìn)程的上下文進(jìn)行讀寫(xiě)操作。通過(guò)ptrace()調(diào)用可以對(duì)進(jìn)程間通信進(jìn)行跟蹤,,使得一個(gè)進(jìn)程可動(dòng)態(tài)地讀寫(xiě)另一個(gè)進(jìn)程的內(nèi)存和寄存器值,,包括代碼段,、數(shù)據(jù)段和堆棧段,以及訪問(wèn)和修改通用寄存器和專(zhuān)用寄存器[7],。其故障注入原理為利用ptrace()調(diào)用追蹤應(yīng)用進(jìn)程,,對(duì)應(yīng)用進(jìn)程中的系統(tǒng)調(diào)用服務(wù)注入故障,并由ptrace()監(jiān)控應(yīng)用進(jìn)程故障注入結(jié)果[8],。
故障注入程序運(yùn)行時(shí),,父進(jìn)程執(zhí)行fork()生成子進(jìn)程,子進(jìn)程執(zhí)行系統(tǒng)調(diào)用ptrace(),使該子進(jìn)程處于被追蹤的狀態(tài),,程序同時(shí)開(kāi)辟共享內(nèi)存空間并定義一個(gè)全局的故障存儲(chǔ)數(shù)據(jù)結(jié)構(gòu),,父子進(jìn)程間通過(guò)信號(hào)量互斥的方法使用共享內(nèi)存?zhèn)魉蛿?shù)據(jù)。父進(jìn)程將request,、addr和data拷貝到該數(shù)據(jù)結(jié)構(gòu)后喚醒子進(jìn)程并使其進(jìn)入就緒狀態(tài),,然后進(jìn)入睡眠直到子進(jìn)程響應(yīng)。當(dāng)子進(jìn)程繼續(xù)運(yùn)行時(shí),,執(zhí)行適當(dāng)?shù)母櫭?,把子進(jìn)程的回答寫(xiě)到故障存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)中去,然后喚醒父進(jìn)程,。根據(jù)故障注入程序設(shè)計(jì)的不同,,可釋放子進(jìn)程,也可使子進(jìn)程掛起并等待新的命令,以便再次進(jìn)入被追蹤狀態(tài)執(zhí)行故障測(cè)試項(xiàng),。當(dāng)故障注入程序繼續(xù)執(zhí)行時(shí),,父進(jìn)程調(diào)用ptrace()追蹤測(cè)試項(xiàng),將子進(jìn)程提供的返回值保存起來(lái),,對(duì)故障值與參考值進(jìn)行比較,,如果不符即表示存在容錯(cuò)機(jī)制未覆蓋的故障,然后將故障存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)有效值返回給用戶,。圖2是利用ptrace()實(shí)現(xiàn)的故障注入方法流程圖,。
通過(guò)Ptrace函數(shù)就可以實(shí)現(xiàn)Linux系統(tǒng)的故障注入,將可能引發(fā)故障的數(shù)據(jù)注入到被測(cè)系統(tǒng)中,,通過(guò)分析注入后的結(jié)果數(shù)據(jù)來(lái)判定程序中是否存在特定故障,。
4 測(cè)試實(shí)現(xiàn)
隨著嵌入式系統(tǒng)在使用過(guò)程中出現(xiàn)的各種問(wèn)題被不斷地解決,系統(tǒng)的魯棒性也隨之不斷提高,。多數(shù)嵌入式系統(tǒng)的開(kāi)源性質(zhì)也決定了其魯棒性提升得很快[9],,Linux系統(tǒng)便是一個(gè)很好的例子。
實(shí)驗(yàn)中利用故障注入方法對(duì)Linux內(nèi)核進(jìn)行API調(diào)用的魯棒性測(cè)試,,將其API劃分為進(jìn)程管理,、進(jìn)程通信、文件系統(tǒng)、內(nèi)存管理,、網(wǎng)絡(luò)管理這五方面,。測(cè)試環(huán)境:宿主機(jī)為DELL的DIMENSION 4700,操作系統(tǒng)為Windows xp-sp3;目標(biāo)機(jī)為友善之臂的ARM開(kāi)發(fā)套件,,系統(tǒng)為基于ARM移植的Linux系統(tǒng),,內(nèi)核為2.2.24。整個(gè)故障注入測(cè)試過(guò)程是:在宿主機(jī)上選擇故障注入測(cè)試項(xiàng),,根據(jù)不同API調(diào)用對(duì)象生成所需參數(shù),,然后將上述測(cè)試信息傳遞至目標(biāo)系統(tǒng)。在目標(biāo)系統(tǒng)上,,根據(jù)接口信息要求生成測(cè)試任務(wù)項(xiàng),。根據(jù)故障注入對(duì)象選擇故障注入方法,根據(jù)接口信息中的參數(shù)進(jìn)行故障注入,將收集到的測(cè)試結(jié)果返回至宿主機(jī)進(jìn)行結(jié)果分析[10],。在實(shí)驗(yàn)中采用GNU的調(diào)試工具GDB觀察目標(biāo)機(jī)系統(tǒng)內(nèi)存和寄存器的值,,利用文件系統(tǒng)觀察測(cè)試數(shù)據(jù)信息,使用串口打印信息進(jìn)行調(diào)試,。通過(guò)這些方法監(jiān)視系統(tǒng)狀態(tài),,并進(jìn)行多次試驗(yàn)觀察。表1 為實(shí)驗(yàn)故障注入結(jié)果分析,。
測(cè)試結(jié)果表明,系統(tǒng)API中進(jìn)程管理和進(jìn)程通信等調(diào)用失效率較低,,文件系統(tǒng)類(lèi)型調(diào)用是故障高發(fā)部位,,經(jīng)過(guò)測(cè)試分析發(fā)現(xiàn)其較大的失效概率主要是由于高級(jí)I/O、字符串處理和字符處理類(lèi)函數(shù)的健壯性失效而引起[11],。實(shí)驗(yàn)通過(guò)故障注入導(dǎo)致系統(tǒng)產(chǎn)生失效狀態(tài),,通過(guò)分析失效狀態(tài)下的故障注入位置和參數(shù)信息,對(duì)系統(tǒng)容錯(cuò)機(jī)制的漏洞進(jìn)行了完善,,使系統(tǒng)內(nèi)核函數(shù)的魯棒性得到有效提升,。
魯棒性是衡量系統(tǒng)性能的重要指標(biāo),盡管已經(jīng)有了一些測(cè)試方法和工具,,嵌入式系統(tǒng)的魯棒性測(cè)試仍然是一個(gè)需要完善的領(lǐng)域[12],。本文在分析軟件故障注入技術(shù)的基礎(chǔ)上,提出了嵌入式系統(tǒng)魯棒性測(cè)試的故障注入方法,,完成了基于Linux系統(tǒng)API接口的故障注入實(shí)驗(yàn),,并對(duì)實(shí)驗(yàn)獲取的故障注入結(jié)果進(jìn)行了分析。測(cè)試結(jié)果表明,,使用這種測(cè)試方法降低了系統(tǒng)失效概率,,根據(jù)測(cè)試結(jié)果生成相應(yīng)的保護(hù)代碼后使該嵌入式系統(tǒng)的魯棒性得到進(jìn)一步保證。
參考文獻(xiàn)
[1] 劉利枚,汪文勇,唐科.嵌入式軟件測(cè)試方法與技術(shù)[J].計(jì)算機(jī)與現(xiàn)代化,2005,116(4):124-126.
[2] 王樂(lè)春,龔正虎,陳建榮.基于錯(cuò)誤注入技術(shù)的協(xié)議實(shí)現(xiàn)魯棒性測(cè)試體系結(jié)構(gòu)[J].計(jì)算機(jī)工程與應(yīng)用, 2003,47
(22):139-141,184.
[3] 朱鴻宇,謝余強(qiáng),劉瑰.基于故障注入發(fā)現(xiàn)緩沖區(qū)溢出漏洞的研究[J].微計(jì)算機(jī)應(yīng)用,2005,26(6):676-679.
[4] SOSNOWSKI J GAWKOWSKI P: Enhancing fault injection testbench[A].In:DepCos-RELCOMEX’06[C].2006:76-83.
[5] TANG D. Engineering oriented dependability Evaluation:MEADEP and its application[A].Fault-Tolerant Systems Proceeding IEEE[C].1997:85-90.
[6] 任獻(xiàn)彬.測(cè)控軟件的軟件測(cè)試方法研究[J].計(jì)算機(jī)測(cè)量與控制,2002,10(8):547-549.
[7] 周章慧,王同洋,吳俊軍,等.基于有限狀態(tài)機(jī)的健壯性測(cè)試研究[J].計(jì)算機(jī)工程與科學(xué), 2009, 31(5):93-97.
[8] HSUEH M C,TSAI T K,,IYER R K. Fault injection techniques and Tools[J].IEEE Computer,1997,30(4):75-82.
[9] 王軼辰,徐萍.嵌入式軟件機(jī)內(nèi)測(cè)試的設(shè)計(jì)與測(cè)試[J].計(jì)算機(jī)工程,2009,35(17):34-36,39.
[10] 石君友,李鄭,駱明珠,,等.故障注入控制軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].測(cè)控技術(shù),2008,27(04):65-67,70.
[11] 任獻(xiàn)彬.測(cè)控軟件的軟件測(cè)試方法研究[J].計(jì)算機(jī)測(cè)量與控制,2002,10(8):547-549.
[12] 鄭人杰.計(jì)算機(jī)軟件測(cè)試技術(shù)[M].北京:清華大學(xué)出版社,1990.