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