摘要:提出了通過向構件中關鍵位置注入故障的方式來判定構件的容錯性能。實踐表明,該方法將有效地檢測構件的容錯能力。
關鍵詞:構件; 故障注入; 容錯性檢測
中圖分類號:TP31文獻標志碼:A
文章編號:1001-3695(2008)05-1402-02
基于構件的方法使得大型軟件系統的開發和維護變得更為簡單,可以提高軟件的復用性和軟件開發效率[1]。但是,復用質量低下的軟件構件則會起到相反的作用,尤其是在一些對系統可靠性要求較高的領域,如航空航天、工業控制等領域,容錯性成為需要解決的首要問題。因為使用可靠性差的構件會帶來災難性的后果[2],有必要對構件的容錯性能進行檢測,從而保證構件系統的可靠性。
檢測構件容錯性能的傳統方法是通過觀察構件系統的失效行為,進而分析錯誤記錄來完成的。但是對一個高可靠系統而言,不可能等待太長的時間來獲取有關的統計結果。因此,使用故障注入方法向系統的構件中注入故障,以獲取構件現場信息進而分析其行為就顯得十分必要。現存在很多故障注入方法,如按故障注入觸發時間[3]可分為編譯期間注入故障和運行期間注入故障兩類;按故障注入觸發方式[4]可分為定時(time-based) 觸發、運行期間注入故障和負載(stress-based)觸發三類。雖然有很多學者研究了各類故障注入方法[5~8],但是目前的故障注入方法僅僅是在程序執行過程中通過相對隨意地修改寄存器的值來注入故障,而沒有依據程序中常見的一些故障類型,所以在檢測構件中是否存在特定故障類型方面存在不足。本文結合反匯編和故障注入的思想提出了一種檢測構件中是否存在非法除故障的方法。
1故障注入基礎
1.1故障注入
故障注入技術首次在國際上提出是在20世紀70年代,之后一直被工業界用來進行容錯系統的設計和驗證[9]。到了80年代中期,故障注入技術才作為系統中容錯機制的實驗評價方法開始被高校和科研部門采用。進入90年代之后,該技術引起了眾多研究人員和工程設計者的重視,對故障注入的研究與應用也隨之深入。故障注入方法包括硬件和軟件實現的故障注入方法。本文中主要是采用軟件實現的故障注入方法來檢測構件的容錯性。它根據某種故障模型通過修改存儲器或寄存器內容來模擬軟件故障的發生。軟件實現的故障注入方法比較簡單,通過修改特定寄存器中的數值來觀察實驗結果,能夠很好地檢測軟件的容錯性能。
1.2故障注入技術原理
軟件故障注入方法是通過特定的程序對系統軟件、硬件錯誤狀態進行仿真[10]。主要是通過修改程序執行語句,增加、修改、刪除數據或直接修改寄存器或存儲器的內容來模擬硬件或軟件故障的發生。
故障注入原理可用如圖1所示的行為循環層次結構模型進行說明。圖中作為實驗過程的故障注入由四個步驟組成:選擇故障模型、執行故障注入、監視系統行為、分析實驗結果。其中,選擇故障模型和分析實驗結果是與實驗者直接交互的過程,為離線行為;執行故障注入和監視系統行為與目標系統直接接口,為在線行為。一次完整的故障注入實驗包括由實驗者至選擇故障模型、執行故障注入、運行工作負載的目標系統、監視系統行為和分析實驗結果的整個循環過程。
2構件容錯性測試方法
2.1研究的前提
本文的研究前提有三個方面:a)在構件中很容易出現常見的導致異常情況的故障,包括內存泄漏故障、數組越界故障、非法計算故障等,而非法計算故障又是構件中特別常見的故障。因此本文將以非法計算故障中除數為零故障為例,討論通過在除法運算前的某個位置注入除數零故障來檢查構件對于除數為零故障的容錯性能。b)假設對構件使用者來說源代碼是不可見的。c)將二進制代碼反匯編成匯編代碼是能夠實現的。
2.2構件容錯性測試原理
由于構件的源代碼是不可見的,為了檢查構件對除數為零故障的容錯性,可以考慮首先通過常用的反匯編工具,如W32Dasm、IDA等將構件的二進制代碼反匯編成匯編代碼;然后再結合上面提到的故障注入原理和故障注入觸發方法來選擇合適的時機在匯編代碼中注入故障。根據要處理的問題和現有故障注入觸發方法的分析,筆者選擇運行期間并在除法事件發生前注入故障;故障注入的位置選擇在除法運算前對除數做的最近一次數據傳送指令處,在這個位置將除數值改為零,然后繼續單步執行該程序并觀察程序是否出現異常。如果出現異常,則說明該構件對除數為零故障這類故障的容錯性較差。
2.3構件容錯性測試算法
首先將二進制代碼反匯編成匯編代碼;之后開始匯編代碼的靜態分析,在分析的過程中確定注入故障的位置;接著單步執行該匯編代碼,在執行到特定位置處注入故障;然后繼續單步執行并觀察程序是否出現異常。如果出現異常,則說明該構件對除數為零故障的容錯性能較差;否則就繼續執行直到程序結束。本文就是通過這種方法來檢查構件對于除數為零故障的容錯性能。
該過程(圖2)的詳細步驟如下:
a)構件程序的反匯編過程。在這里選擇常用的IDA反匯編工具,將構件文件,即可執行文件(.exe)或者動態鏈接庫文件(.dll)等二進制文件轉換成匯編代碼。
b)確定故障注入位置。 開始靜態分析匯編代碼,在分析的過程中確定要注入故障的位置,即后面單步執行匯編代碼時,到底執行到哪一步時才修改寄存器值,并將這些位置值記錄在一個表中。
c)單步執行匯編代碼。緊接著單步執行匯編代碼,如果執行到剛才確定的位置時,就停下并執行步驟d)。d)執行故障注入。修改存儲除數寄存器的值,將寄存器的值改為零,也就是將除數設為零,然后繼續單步執行。
e)監視程序執行。在執行過程中觀察程序是否出現異常。如果出現異常,則說明該構件對除數為零故障容錯性能較差;否則就繼續執行步驟c)。如果執行到需要注入故障的位置時,就停下執行步驟d),直到程序結束。
4實例分析
下面通過一個實例程序來分析一下測試過程,被檢測的程序代碼如下:
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;
經過編譯調試后生成二進制可執行文件,然后通過IDA反匯編工具將可執行文件反匯編成匯編代碼。主要代碼如下:
.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
靜態分析該匯編代碼可以得出,在.text:00401270和text:00401296處存在除法指令。其中存儲除數的地址為[ebp+s],然后找到除法運算前除數的最后一次mov指令處為.text:00401261和.text:0040128D,即要注入故障的位置。緊接著單步執行匯編代碼,在執行到剛才記錄的位置時,將存儲除數的寄存器即[ebp+s]的值改為零,并繼續執行,在執行到.text:00401296時,出現了除數為零的故障。結合源代碼的分析可以知道,該程序對除數為零的故障容錯性能較差。
5結束語
本文提出了一種通過故障注入手段來檢測構件中非法除故障容錯性的方法。首先通過反匯編工具將構件的二進制代碼轉換成匯編代碼;然后分析匯編代碼并確定故障注入位置,并在執行到特定位置時注入故障,通過觀察程序執行過程中是否出現異常來判定構件的容錯性;最后,通過實驗進行了驗證,結果表明該方法能有效地檢測出構件對于除數為零故障的容錯性能。下一步研究的主要方向是考慮如何檢測構件關于數組越界、內存泄漏以及其他類型的非法計算問題等故障的容錯性。
參考文獻:
[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的研究與實現[D].哈爾濱:哈爾濱工業大學,2002.
[4]孫峻朝,李運策,楊孝宗.故障注入研究的一種理論框架[J].小型微型計算機系統,1999,20(11):816-819.
[5]楊孝宗.容錯技術與STRATUS容錯計算機[M].哈爾濱:哈爾濱工業大學出版社,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.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”