摘要:提出了通過(guò)向構(gòu)件中關(guān)鍵位置注入故障的方式來(lái)判定構(gòu)件的容錯(cuò)性能。實(shí)踐表明,該方法將有效地檢測(cè)構(gòu)件的容錯(cuò)能力。
關(guān)鍵詞:構(gòu)件; 故障注入; 容錯(cuò)性檢測(cè)
中圖分類(lèi)號(hào):TP31文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1001-3695(2008)05-1402-02
基于構(gòu)件的方法使得大型軟件系統(tǒng)的開(kāi)發(fā)和維護(hù)變得更為簡(jiǎn)單,可以提高軟件的復(fù)用性和軟件開(kāi)發(fā)效率[1]。但是,復(fù)用質(zhì)量低下的軟件構(gòu)件則會(huì)起到相反的作用,尤其是在一些對(duì)系統(tǒng)可靠性要求較高的領(lǐng)域,如航空航天、工業(yè)控制等領(lǐng)域,容錯(cuò)性成為需要解決的首要問(wèn)題。因?yàn)槭褂每煽啃圆畹臉?gòu)件會(huì)帶來(lái)災(zāi)難性的后果[2],有必要對(duì)構(gòu)件的容錯(cuò)性能進(jìn)行檢測(cè),從而保證構(gòu)件系統(tǒng)的可靠性。
檢測(cè)構(gòu)件容錯(cuò)性能的傳統(tǒng)方法是通過(guò)觀察構(gòu)件系統(tǒng)的失效行為,進(jìn)而分析錯(cuò)誤記錄來(lái)完成的。但是對(duì)一個(gè)高可靠系統(tǒng)而言,不可能等待太長(zhǎng)的時(shí)間來(lái)獲取有關(guān)的統(tǒng)計(jì)結(jié)果。因此,使用故障注入方法向系統(tǒng)的構(gòu)件中注入故障,以獲取構(gòu)件現(xiàn)場(chǎng)信息進(jìn)而分析其行為就顯得十分必要?,F(xiàn)存在很多故障注入方法,如按故障注入觸發(fā)時(shí)間[3]可分為編譯期間注入故障和運(yùn)行期間注入故障兩類(lèi);按故障注入觸發(fā)方式[4]可分為定時(shí)(time-based) 觸發(fā)、運(yùn)行期間注入故障和負(fù)載(stress-based)觸發(fā)三類(lèi)。雖然有很多學(xué)者研究了各類(lèi)故障注入方法[5~8],但是目前的故障注入方法僅僅是在程序執(zhí)行過(guò)程中通過(guò)相對(duì)隨意地修改寄存器的值來(lái)注入故障,而沒(méi)有依據(jù)程序中常見(jiàn)的一些故障類(lèi)型,所以在檢測(cè)構(gòu)件中是否存在特定故障類(lèi)型方面存在不足。本文結(jié)合反匯編和故障注入的思想提出了一種檢測(cè)構(gòu)件中是否存在非法除故障的方法。
1故障注入基礎(chǔ)
1.1故障注入
故障注入技術(shù)首次在國(guó)際上提出是在20世紀(jì)70年代,之后一直被工業(yè)界用來(lái)進(jìn)行容錯(cuò)系統(tǒng)的設(shè)計(jì)和驗(yàn)證[9]。到了80年代中期,故障注入技術(shù)才作為系統(tǒng)中容錯(cuò)機(jī)制的實(shí)驗(yàn)評(píng)價(jià)方法開(kāi)始被高校和科研部門(mén)采用。進(jìn)入90年代之后,該技術(shù)引起了眾多研究人員和工程設(shè)計(jì)者的重視,對(duì)故障注入的研究與應(yīng)用也隨之深入。故障注入方法包括硬件和軟件實(shí)現(xiàn)的故障注入方法。本文中主要是采用軟件實(shí)現(xiàn)的故障注入方法來(lái)檢測(cè)構(gòu)件的容錯(cuò)性。它根據(jù)某種故障模型通過(guò)修改存儲(chǔ)器或寄存器內(nèi)容來(lái)模擬軟件故障的發(fā)生。軟件實(shí)現(xiàn)的故障注入方法比較簡(jiǎn)單,通過(guò)修改特定寄存器中的數(shù)值來(lái)觀察實(shí)驗(yàn)結(jié)果,能夠很好地檢測(cè)軟件的容錯(cuò)性能。
1.2故障注入技術(shù)原理
軟件故障注入方法是通過(guò)特定的程序?qū)ο到y(tǒng)軟件、硬件錯(cuò)誤狀態(tài)進(jìn)行仿真[10]。主要是通過(guò)修改程序執(zhí)行語(yǔ)句,增加、修改、刪除數(shù)據(jù)或直接修改寄存器或存儲(chǔ)器的內(nèi)容來(lái)模擬硬件或軟件故障的發(fā)生。
故障注入原理可用如圖1所示的行為循環(huán)層次結(jié)構(gòu)模型進(jìn)行說(shuō)明。圖中作為實(shí)驗(yàn)過(guò)程的故障注入由四個(gè)步驟組成:選擇故障模型、執(zhí)行故障注入、監(jiān)視系統(tǒng)行為、分析實(shí)驗(yàn)結(jié)果。其中,選擇故障模型和分析實(shí)驗(yàn)結(jié)果是與實(shí)驗(yàn)者直接交互的過(guò)程,為離線行為;執(zhí)行故障注入和監(jiān)視系統(tǒng)行為與目標(biāo)系統(tǒng)直接接口,為在線行為。一次完整的故障注入實(shí)驗(yàn)包括由實(shí)驗(yàn)者至選擇故障模型、執(zhí)行故障注入、運(yùn)行工作負(fù)載的目標(biāo)系統(tǒng)、監(jiān)視系統(tǒng)行為和分析實(shí)驗(yàn)結(jié)果的整個(gè)循環(huán)過(guò)程。
2構(gòu)件容錯(cuò)性測(cè)試方法
2.1研究的前提
本文的研究前提有三個(gè)方面:a)在構(gòu)件中很容易出現(xiàn)常見(jiàn)的導(dǎo)致異常情況的故障,包括內(nèi)存泄漏故障、數(shù)組越界故障、非法計(jì)算故障等,而非法計(jì)算故障又是構(gòu)件中特別常見(jiàn)的故障。因此本文將以非法計(jì)算故障中除數(shù)為零故障為例,討論通過(guò)在除法運(yùn)算前的某個(gè)位置注入除數(shù)零故障來(lái)檢查構(gòu)件對(duì)于除數(shù)為零故障的容錯(cuò)性能。b)假設(shè)對(duì)構(gòu)件使用者來(lái)說(shuō)源代碼是不可見(jiàn)的。c)將二進(jìn)制代碼反匯編成匯編代碼是能夠?qū)崿F(xiàn)的。
2.2構(gòu)件容錯(cuò)性測(cè)試原理
由于構(gòu)件的源代碼是不可見(jiàn)的,為了檢查構(gòu)件對(duì)除數(shù)為零故障的容錯(cuò)性,可以考慮首先通過(guò)常用的反匯編工具,如W32Dasm、IDA等將構(gòu)件的二進(jìn)制代碼反匯編成匯編代碼;然后再結(jié)合上面提到的故障注入原理和故障注入觸發(fā)方法來(lái)選擇合適的時(shí)機(jī)在匯編代碼中注入故障。根據(jù)要處理的問(wèn)題和現(xiàn)有故障注入觸發(fā)方法的分析,筆者選擇運(yùn)行期間并在除法事件發(fā)生前注入故障;故障注入的位置選擇在除法運(yùn)算前對(duì)除數(shù)做的最近一次數(shù)據(jù)傳送指令處,在這個(gè)位置將除數(shù)值改為零,然后繼續(xù)單步執(zhí)行該程序并觀察程序是否出現(xiàn)異常。如果出現(xiàn)異常,則說(shuō)明該構(gòu)件對(duì)除數(shù)為零故障這類(lèi)故障的容錯(cuò)性較差。
2.3構(gòu)件容錯(cuò)性測(cè)試算法
首先將二進(jìn)制代碼反匯編成匯編代碼;之后開(kāi)始匯編代碼的靜態(tài)分析,在分析的過(guò)程中確定注入故障的位置;接著單步執(zhí)行該匯編代碼,在執(zhí)行到特定位置處注入故障;然后繼續(xù)單步執(zhí)行并觀察程序是否出現(xiàn)異常。如果出現(xiàn)異常,則說(shuō)明該構(gòu)件對(duì)除數(shù)為零故障的容錯(cuò)性能較差;否則就繼續(xù)執(zhí)行直到程序結(jié)束。本文就是通過(guò)這種方法來(lái)檢查構(gòu)件對(duì)于除數(shù)為零故障的容錯(cuò)性能。
該過(guò)程(圖2)的詳細(xì)步驟如下:
a)構(gòu)件程序的反匯編過(guò)程。在這里選擇常用的IDA反匯編工具,將構(gòu)件文件,即可執(zhí)行文件(.exe)或者動(dòng)態(tài)鏈接庫(kù)文件(.dll)等二進(jìn)制文件轉(zhuǎn)換成匯編代碼。
b)確定故障注入位置。 開(kāi)始靜態(tài)分析匯編代碼,在分析的過(guò)程中確定要注入故障的位置,即后面單步執(zhí)行匯編代碼時(shí),到底執(zhí)行到哪一步時(shí)才修改寄存器值,并將這些位置值記錄在一個(gè)表中。
c)單步執(zhí)行匯編代碼。緊接著單步執(zhí)行匯編代碼,如果執(zhí)行到剛才確定的位置時(shí),就停下并執(zhí)行步驟d)。d)執(zhí)行故障注入。修改存儲(chǔ)除數(shù)寄存器的值,將寄存器的值改為零,也就是將除數(shù)設(shè)為零,然后繼續(xù)單步執(zhí)行。
e)監(jiān)視程序執(zhí)行。在執(zhí)行過(guò)程中觀察程序是否出現(xiàn)異常。如果出現(xiàn)異常,則說(shuō)明該構(gòu)件對(duì)除數(shù)為零故障容錯(cuò)性能較差;否則就繼續(xù)執(zhí)行步驟c)。如果執(zhí)行到需要注入故障的位置時(shí),就停下執(zhí)行步驟d),直到程序結(jié)束。
4實(shí)例分析
下面通過(guò)一個(gè)實(shí)例程序來(lái)分析一下測(cè)試過(guò)程,被檢測(cè)的程序代碼如下:
int i=10;intj;scanf(\"%d\",j);
int s=i*j;if(s!=0)i=100/s;
scanf(\"%d\",j);s=i*j;i=100/s;
經(jīng)過(guò)編譯調(diào)試后生成二進(jìn)制可執(zhí)行文件,然后通過(guò)IDA反匯編工具將可執(zhí)行文件反匯編成匯編代碼。主要代碼如下:
.text:0040123Cpublic_main
.text:0040123C _mainproc near
.text:0040123C s =dword ptr-0Ch
.text:0040123C j =dword ptr-8
.text:0040123C i =dword ptr-4
.text:0040123C argc=dword ptr8
.text:0040123C argv=dword ptr0Ch
.text:0040123C envp =dword ptr 10h
.text:0040123C pushebp
.text:0040123Dmovebp, esp
.text:0040123Fadd esp, 0FFFFFFF4h
.text:00401242 mov [ebp+i], 0Ah
.text:00401249lea eax, [ebp+j]
.text:0040124Cpusheax
.text:0040124D pushoffset unk_4180A4
.text:00401252call___org_scanf
.text:00401257 add esp, 8
.text:0040125A mov edx, [ebp+i]
.text:0040125Dimuledx, [ebp+j]
.text:00401261 mov [ebp+s], edx
.text:00401264 cmp [ebp+s], 0
.text:00401268 jzshort loc_401276
.text:0040126A mov eax, 64h
.text:0040126F cdq
.text:00401270idiv[ebp+s]
.text:00401273mov [ebp+i], eax
.text:00401276 loc_401276:; CODE XREF: _main+2C↑j
.text:00401276 lea ecx, [ebp+j]
.text:00401279pushecx
.text:0040127Apushoffset unk_4180A7
.text:0040127F call___org_scanf
.text:00401284 add esp, 8
.text:00401287 mov eax, [ebp+i]
.text:0040128A imul[ebp+j]
.text:0040128D mov [ebp+s], eax
.text:00401290 moveax, 64h
.text:00401295 cdq
.text:00401296 idiv[ebp+s]
.text:00401299 mov[ebp+i], eax
.text:0040129Cmovesp, ebp
.text:0040129E pop ebp
.text:0040129F retn
靜態(tài)分析該匯編代碼可以得出,在.text:00401270和text:00401296處存在除法指令。其中存儲(chǔ)除數(shù)的地址為[ebp+s],然后找到除法運(yùn)算前除數(shù)的最后一次mov指令處為.text:00401261和.text:0040128D,即要注入故障的位置。緊接著單步執(zhí)行匯編代碼,在執(zhí)行到剛才記錄的位置時(shí),將存儲(chǔ)除數(shù)的寄存器即[ebp+s]的值改為零,并繼續(xù)執(zhí)行,在執(zhí)行到.text:00401296時(shí),出現(xiàn)了除數(shù)為零的故障。結(jié)合源代碼的分析可以知道,該程序?qū)Τ龜?shù)為零的故障容錯(cuò)性能較差。
5結(jié)束語(yǔ)
本文提出了一種通過(guò)故障注入手段來(lái)檢測(cè)構(gòu)件中非法除故障容錯(cuò)性的方法。首先通過(guò)反匯編工具將構(gòu)件的二進(jìn)制代碼轉(zhuǎn)換成匯編代碼;然后分析匯編代碼并確定故障注入位置,并在執(zhí)行到特定位置時(shí)注入故障,通過(guò)觀察程序執(zhí)行過(guò)程中是否出現(xiàn)異常來(lái)判定構(gòu)件的容錯(cuò)性;最后,通過(guò)實(shí)驗(yàn)進(jìn)行了驗(yàn)證,結(jié)果表明該方法能有效地檢測(cè)出構(gòu)件對(duì)于除數(shù)為零故障的容錯(cuò)性能。下一步研究的主要方向是考慮如何檢測(cè)構(gòu)件關(guān)于數(shù)組越界、內(nèi)存泄漏以及其他類(lèi)型的非法計(jì)算問(wèn)題等故障的容錯(cuò)性。
參考文獻(xiàn):
[1]BROWN A W,WALLNAU K C. The current state of CBSE [J].IEEE Trans on Software, 1998,15(5):37-46.
[2]WEYUKER E J. Testing component-based software: a cautionary tale[J].IEEE Trans on Software,1998,15(5):54-59.
[3]董劍.嵌入式故障注入器HFI-4的研究與實(shí)現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2002.
[4]孫峻朝,李運(yùn)策,楊孝宗.故障注入研究的一種理論框架[J].小型微型計(jì)算機(jī)系統(tǒng),1999,20(11):816-819.
[5]楊孝宗.容錯(cuò)技術(shù)與STRATUS容錯(cuò)計(jì)算機(jī)[M].哈爾濱:哈爾濱工業(yè)大學(xué)出版社,1993:1-4.
[6]GOSWAMI K K, IYER R K, YOUNG L. DEPEND: a simulation-based environment for system level dependability analysis[J].IEEE Trans on Computers, 1997,46(1):60-74.
[7]MALHOTRA M, TRIVELE K S. Dependability modeling using Petri-nets[C]//Proc of IEEE Int Symp on Fault Tolerant Computing. 1995:428-440.
[8]TAI A T, TRIVEDI K S. Toward accessibility enhancement of dependability modeling techniques and tools[C]//Proc of the 27th IEEE Int Symp on Fault-Tolerant Computing. 1997:37-41.
[9]TANG D. Dependability measurement and modeling of a multicompu-ter system[J].IEEE Trans on Computers,1993,42(1):62-74.
[10]HSUEH M C, IYER R K. Dependability and performance measurement[C]//Proc of IEEE Workshop on CADTED. Beijing:[s.n.], 1996:11-22.
“本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文”