專利名稱:一種基于程序動態(tài)依賴關(guān)系的軟件故障定位方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機軟件自動化調(diào)試技術(shù),尤其涉及一種基于程序動態(tài)依賴關(guān)系的
軟件故障定位方法。
背景技術(shù):
軟件調(diào)試,是軟件開發(fā)過程中發(fā)現(xiàn)和減少軟件缺陷的一個過程,通常始于程序出
現(xiàn)故障以后。軟件故障一般通過三個階段產(chǎn)生程序員在代碼中制造了一個缺陷,缺陷造成
了程序中的錯誤狀態(tài),錯誤狀態(tài)進而引發(fā)了程序故障,它以可感知的外部錯誤的形式出現(xiàn)。
隨后,程序員會執(zhí)行某個失敗的測試用例,使用調(diào)試器反復設(shè)置斷點,觀察程序狀態(tài)直到錯
誤狀態(tài)的出現(xiàn)。然后推斷可能的感染源,定位缺陷位置并驗證,修正軟件缺陷。
當前,軟件中的某些缺陷或錯誤,可以通過改進軟件開發(fā)環(huán)境,靜態(tài)的探測源代碼
或動態(tài)的檢查對不變量的違反來輔助發(fā)現(xiàn);而絕大多數(shù)錯誤,則只能依賴于開發(fā)人員的經(jīng)
驗和直覺,通過人工的方式來發(fā)現(xiàn)。 人工審查代碼,以及在程序中插入輸出語句或斷言,單步執(zhí)行跟蹤缺陷軌跡等方法的效率很低,軟件開發(fā)人員在調(diào)試上花費了大量的時間和精力——據(jù)統(tǒng)計大約要占去工作的一半甚至更多,這也是軟件系統(tǒng)中的缺陷難以在開發(fā)過程中充分修復的一個重要原因。另外,調(diào)試需要對于程序的功能和實現(xiàn)有較深入的理解,是一件比較困難的工作,所以調(diào)試任務(wù)通常只能由程序的開發(fā)人員來完成,其他人員難以勝任,這樣一來就會影響軟件的開發(fā)速度。 手工調(diào)試已經(jīng)難以適應(yīng)軟件質(zhì)量保證和快速開發(fā)的雙重要求。如果有自動化的調(diào)
試方法,可以根據(jù)測試用例的狀態(tài)信息,以及各種程序?qū)嶓w執(zhí)行的覆蓋信息,指出軟件缺陷
在源代碼中可能存在的位置,無疑將極大的提高軟件生產(chǎn)率和軟件質(zhì)量。 程序依賴關(guān)系反映了程序?qū)嶓w之間相互作用的關(guān)系。它包含兩種數(shù)據(jù)依賴關(guān)系
和控制依賴關(guān)系。數(shù)據(jù)依賴關(guān)系表示由于數(shù)據(jù)的定義和使用形成的實體之間的關(guān)系。通俗
的講,如果兩條語句存在數(shù)據(jù)依賴關(guān)系,當調(diào)換這兩條語句時,則會使得其中至少一條語句
中使用的變量的值不正確??刂埔蕾囮P(guān)系表示由于控制流引起的程序?qū)嶓w之間的關(guān)系。通
俗的講,如果一個謂詞表達式的值會影響到一條語句是否被執(zhí)行,則語句控制依賴于謂詞
表達式。從程序是否被執(zhí)行的角度,程序依賴關(guān)系又可以分為靜態(tài)依賴關(guān)系和動態(tài)依賴關(guān)
系兩種。靜態(tài)依賴關(guān)系顯示了實體間所有可能的相互作用關(guān)系,而動態(tài)依賴關(guān)系則表明了
某次執(zhí)行中程序?qū)嶓w相互作用的情況。 在回歸測試,每日構(gòu)建,測試驅(qū)動的開發(fā)等軟件開發(fā)的一些場景中,由于軟件版本的變更,經(jīng)常會在源代碼中引入難以發(fā)現(xiàn)的缺陷。針對這些缺陷的調(diào)試工作會很頻繁和煩瑣。但同時,在這些場景中,程序的源代碼,一套測試組件的狀態(tài)信息和程序的動態(tài)依賴關(guān)系都是可以獲得的。因此,研究一種使用程序動態(tài)依賴關(guān)系和測試用例狀態(tài)信息的故障定位技術(shù),對于提高軟件生產(chǎn)率和軟件質(zhì)量,有著重要的意義。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種基于程序動態(tài)依賴關(guān)系的軟件故障定位方法,通過搜集C語言執(zhí)行時的軌跡信息,解析動態(tài)依賴關(guān)系,計算出可執(zhí)行語句的可疑度,并將它們由大到小排列,以故障定位報告的形式給出,提高了調(diào)試的自動化程度,從而提升軟件的開發(fā)速度。 為達到上述目的,本發(fā)明的技術(shù)方案是這樣實現(xiàn)的 —種基于程序動態(tài)依賴關(guān)系的軟件故障定位方法,該方法包括 A.使用作用于鏈接時的優(yōu)化器,獲取程序源文件中存在的靜態(tài)控制依賴信息,編
譯源文件為可執(zhí)行文件,并對其進行動態(tài)二進制插裝; B.根據(jù)得到的靜態(tài)控制依賴信息,基于一組測試用例集執(zhí)行程序,搜集其動態(tài)執(zhí)行軌跡信息,并判定每個測試用例通過或失敗的狀態(tài); C.解析所得到的軌跡信息,得到可執(zhí)行語句間的動態(tài)依賴關(guān)系; D.根據(jù)所生成的動態(tài)依賴關(guān)系,運用依賴關(guān)系的可疑度計算公式,計算每條動態(tài)
依賴關(guān)系的可疑度,然后將可疑度的值映射到對應(yīng)的可執(zhí)行語句上; E.將各語句按照可疑度從大到小進行降序排列,輸出軟件故障定位的報告。 其中,所述被定位的程序源代碼文件為C語言。 所述軟件故障類型包括兩類 數(shù)據(jù)流相關(guān)的故障,包括存在于變量定義,變量使用,變量重定義,變量刪除,常量值的改變等程序操作中的故障; 控制流相關(guān)的故障,包括存在于不必要的代碼塊的添加,路徑的刪除,謂詞條件的
定義,執(zhí)行順序的改變,外部函數(shù)的訪問,函數(shù)值的返回等程序操作中的故障。 步驟A所述的作用于鏈接時的優(yōu)化器,是一種重寫鏈接器,其輸入為目標文件和
庫文件,而不是程序的可執(zhí)行文件。 步驟A所述的動態(tài)二進制插裝過程,是利用一個基于動態(tài)插裝工具,通過在程序
執(zhí)行的過程中插入二進制分析代碼來獲取程序性能信息的過程。 步驟B所述的動態(tài)執(zhí)行軌跡信息,包括 Bl.被執(zhí)行的指令信息 B2.被執(zhí)行的依賴關(guān)系 B3.當前指令所產(chǎn)生的值 信息塊Bl所述中的指令信息,包含了指令的唯一編號,使用的依賴關(guān)系的個數(shù),指令對應(yīng)的文件名和語句行號。 信息塊B2所述中的依賴關(guān)系,包含了被依賴的指令的編號。此外,第一條依賴關(guān)
系總是表示控制依賴關(guān)系,可以為空。之后的依賴關(guān)系均是數(shù)據(jù)依賴關(guān)系。 信息塊B3所述中的值,包含了當前指令定義的值,它們可以是變量的值或者是變
量的地址或為空,并以十六進制的形式表示。 步驟C所述的解析過程,包括 CI.解析得到可執(zhí)行語句間動態(tài)控制依賴關(guān)系的過程
C2.解析得到可執(zhí)行語句間動態(tài)數(shù)據(jù)依賴關(guān)系的過程 步驟C1所述的過程,是根據(jù)B2中的信息得到指令間的動態(tài)控制依賴關(guān)系,再根據(jù)Bl中指令和可執(zhí)行語句間的映射關(guān)系,得到可執(zhí)行語句間的動態(tài)控制依賴關(guān)系的解析過 程。 步驟C2所述的過程,是根據(jù)B2中的信息得到指令間的動態(tài)數(shù)據(jù)依賴關(guān)系,如果B3 中的值是變量的值而非變量的地址,則根據(jù)Bl中指令和可執(zhí)行語句間的映射關(guān)系,得到可 執(zhí)行語句之間的動態(tài)數(shù)據(jù)依賴關(guān)系的解析過程。
步驟D所述的可疑度計算公式,包括如下信息 Dl.動態(tài)數(shù)據(jù)或動態(tài)控制依賴關(guān)系出現(xiàn)在通過的測試用例中的次數(shù)
D2.動態(tài)數(shù)據(jù)或動態(tài)控制依賴關(guān)系出現(xiàn)在失敗的測試用例中的次數(shù)
D3.整套測試組件通過的測試用例的個數(shù)
D4.整套測試組件失敗的測試用例的個數(shù) 步驟E所述的報告,為輔助程序員進行軟件故障定位,按可疑度從大到小排列可 執(zhí)行語句,包括了如下信息El.可執(zhí)行語句所在文件名E2.可執(zhí)行語句所在行號E3.可執(zhí)行語句所在的動態(tài)控制依賴關(guān)系的個數(shù)E4.可執(zhí)行語句所在的動態(tài)數(shù)據(jù)依賴關(guān)系的個數(shù)E5.可執(zhí)行語句的可疑度E6.可執(zhí)行語句的可疑度排名
圖1為本發(fā)明基于程序動態(tài)依賴關(guān)系的軟件故障定位方法流程示意圖。
具體實施例方式
下面結(jié)合附圖及本發(fā)明的實施例對本發(fā)明的方法作進一步詳細的說明。
本發(fā)明的基本思想為首先使用鏈接時的優(yōu)化器處理源文件,得到靜態(tài)的控制依
賴關(guān)系;再通過動態(tài)插裝工具,執(zhí)行測試組件,并得到測試用例狀態(tài)和執(zhí)行軌跡信息;然后
解析執(zhí)行軌跡信息得到動態(tài)依賴關(guān)系;由可疑度計算公式得到動態(tài)依賴關(guān)系的可疑度,并
映射到可執(zhí)行語句上;最后,根據(jù)可執(zhí)行語句的可疑度,生成故障定位報告。
圖1為本發(fā)明基于程序動態(tài)依賴關(guān)系的軟件故障定位方法流程示意圖;如圖1所
示,該方法包括如下步驟 步驟101 :鏈接時優(yōu)化器根據(jù)源代碼編譯生成的二進制文件得到靜態(tài)控制依賴關(guān) 系。 這里,所謂鏈接時優(yōu)化為軟件編譯技術(shù)術(shù)語。它表示由鏈接器執(zhí)行的操作,發(fā)生在 編譯之后程序執(zhí)行之前。鏈接器是一個程序,將一個或多個編譯器或匯編器生成的目標文 件外加庫鏈接為一個可執(zhí)行文件。目標文件是包括機器碼和鏈接器可用信息的程序模塊。 簡單的講,鏈接器的工作就是解析未定義的符號引用,將目標文件中的占位符替換為符號 的地址。鏈接器還要完成程序中各目標文件的地址空間的組織,這可能設(shè)計重定位工作。
所述靜態(tài)控制依賴關(guān)系是指不執(zhí)行程序,僅分析程序源代碼,得到的程序語句和 謂詞間可能存在的控制依賴關(guān)系。
6
步驟102 :動態(tài)插裝工具執(zhí)行測試組件,并根據(jù)靜態(tài)控制依賴關(guān)系,生成執(zhí)行軌跡 信息。同時得到測試組件中各測試用例通過或失敗的狀態(tài)。 這里,所謂動態(tài)插裝為軟件工程術(shù)語,是借助往被測程序中插入操作(稱為"探
針"),以便獲取程序的控制流和數(shù)據(jù)流信息,從而實現(xiàn)測試目的的方法。 測試組件為軟件工程術(shù)語,是測試用例的一組集合,用來測試某個程序是否有特
定的一些行為。 一個測試套件通常也包含對于每個測試用例如何使用和在測試過程中應(yīng)收
集哪些信息的詳細說明。 執(zhí)行軌跡信息是程序執(zhí)行過程的指令流信息的記錄,一般完整地記錄了程序執(zhí)行 過程中所執(zhí)行指令的內(nèi)容和順序。 測試用例的通過或失敗狀態(tài)即可通過人工的方式判定,也可以通過和已知的測試 諭示對比而得到。 步驟103 :根據(jù)所得到的軌跡信息,解析產(chǎn)生可執(zhí)行語句間的動態(tài)依賴關(guān)系。
這里,解析產(chǎn)生的動態(tài)依賴關(guān)系包括動態(tài)控制依賴關(guān)系和動態(tài)數(shù)據(jù)依賴關(guān)系。它 們分別表示在程序執(zhí)行中由于控制流和數(shù)據(jù)流而引起的語句之間的相互作用。
步驟104 :根據(jù)所生成的動態(tài)依賴關(guān)系,運用依賴關(guān)系的可疑度計算公式,計算每 條動態(tài)依賴關(guān)系的可疑度,然后將可疑度的值映射到對應(yīng)的可執(zhí)行語句上。
為說明依賴關(guān)系的可疑度計算公式,引入如下記號
ctrld印(a,b):表示一條控制依賴關(guān)系,語句b控制依賴于語句a
datad印(a, b):表示一條數(shù)據(jù)依賴關(guān)系,語句b數(shù)據(jù)依賴于語句a
d印(a,b):表示一條依賴關(guān)系,可以是ctrld印(a,b)也可以是datad印(a, b)
failed(d印(a, b)):表示依賴關(guān)系d印(a, b)出現(xiàn)在失敗測試用例中的次數(shù)
passed(d印(a, b)):表示依賴關(guān)系d印(a, b)出現(xiàn)在通過測試用例中的次數(shù)
totalfailed :表示測試組件中失敗測試用例總共的個數(shù)
由上,依賴關(guān)系的可疑度計算公式定義如下 ",,、、 孤^(A/7(",6)) = /, ^ .7 j ^ ., J" z M ^ z A:
,ta,/ed x (/az/efi (鄉(xiāng)(a,6) +戸^(鄉(xiāng)(fl,6)) 為說明如何將依賴關(guān)系的可疑度映射到語句上,引入如下記號
First (s):表示語句行號i的集合,i與語句s間有依賴關(guān)系d印(s, i)
Second(s):表示語句行號j的集合,j與語句s間有依賴關(guān)系d印(j, s) , 、 '■ 乂 步驟105 :將得到的各語句的可疑度按從大到小排序,輸出語句所在的文件名,行 號,動態(tài)控制依賴關(guān)系的個數(shù),動態(tài)數(shù)據(jù)依賴關(guān)系的個數(shù),可疑度及排名,產(chǎn)生程序故障定 位報告。 綜上所述,程序動態(tài)依賴關(guān)系的收集和可疑度計算模型是本發(fā)明的核心。最終產(chǎn) 生的故障定位報告,可供開發(fā)者按可疑度從大到小的順序?qū)梢纱a進行審查,減少程序 調(diào)試階段的必須檢查的代碼范圍和數(shù)量,提高定位程序故障的效率。
權(quán)利要求
一種基于程序動態(tài)依賴關(guān)系的軟件故障定位方法,其特征在于,該方法包括A.使用作用于鏈接時的優(yōu)化器,獲取程序源文件中存在的靜態(tài)控制依賴信息,編譯源文件為可執(zhí)行文件,并對其進行動態(tài)二進制插裝;B.根據(jù)得到的靜態(tài)控制依賴信息,基于一組測試用例集執(zhí)行程序,搜集其動態(tài)執(zhí)行軌跡信息,并判定每個測試用例通過或失敗的狀態(tài);C.解析所得到的軌跡信息,得到可執(zhí)行語句間的動態(tài)依賴關(guān)系;D.根據(jù)所生成的動態(tài)依賴關(guān)系,運用依賴關(guān)系的可疑度計算公式,計算每條動態(tài)依賴關(guān)系的可疑度,然后將可疑度的值映射到對應(yīng)的可執(zhí)行語句上;E.將各語句按照可疑度從大到小進行降序排列,輸出軟件故障定位的報告。
2. 根據(jù)權(quán)利要求l所述的定位方法,其特征在于,所述被定位的程序源文件為C語言代 碼文件。
3. 根據(jù)權(quán)利要求1所述的定位方法,其特征在于,所述軟件故障類型包括兩類 數(shù)據(jù)流相關(guān)的故障,包括存在于變量定義,變量使用,變量重定義,變量刪除,常量值的改變;控制流相關(guān)的故障,包括存在于不必要的代碼塊的添加,路徑的刪除,謂詞條件的定 義,執(zhí)行順序的改變,外部函數(shù)的訪問,函數(shù)值的返回。
4. 根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟A所述的作用于鏈接時的優(yōu)化器,是 一種重寫鏈接器,其輸入為目標文件和庫文件,而不是程序的可執(zhí)行文件。
5. 根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟A所述的動態(tài)二進制插裝過程,是利 用一個動態(tài)插裝工具,通過在程序執(zhí)行的過程中插入二進制分析代碼來獲取程序性能信息 的過程。
6. 根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟B所述的動態(tài)執(zhí)行軌跡信息,包括了 Bl.被執(zhí)行的指令信息;B2.被執(zhí)行的依賴關(guān)系; B3.當前指令所產(chǎn)生的值。
7. 根據(jù)權(quán)利要求6所述的方法,其特征在于,信息塊B1中的指令信息,包含了指令的唯 一編號,使用的依賴關(guān)系的個數(shù),指令對應(yīng)的文件名和語句行號。
8. 根據(jù)權(quán)利要求6所述的方法,其特征在于,信息塊B2中的依賴關(guān)系,包含了被依賴的 指令的編號;此外,第一條依賴關(guān)系總是表示控制依賴關(guān)系,可以為空;之后的依賴關(guān)系均 是數(shù)據(jù)依賴關(guān)系。
9. 根據(jù)權(quán)利要求6所述的方法,其特征在于,信息塊B3中的值,包含了當前指令定義的 值,它們可以是變量的值或者是變量的地址或為空,并以十六進制的形式表示。
10. 根據(jù)權(quán)利要求6所述的方法,其特征在于,步驟C所述的解析過程,包括了 Cl.解析Bl和B2的信息得到可執(zhí)行語句間動態(tài)控制依賴關(guān)系的過程;C2.解析Bl, B2和B3的信息得到可執(zhí)行語句間動態(tài)數(shù)據(jù)依賴關(guān)系的過程。
11. 根據(jù)權(quán)利要求10所述的方法,其特征在于,步驟Cl是根據(jù)B2中的信息得到指令間 的動態(tài)控制依賴關(guān)系;再根據(jù)B1中指令和可執(zhí)行語句間的映射關(guān)系,得到可執(zhí)行語句間的 動態(tài)控制依賴關(guān)系。
12. 根據(jù)權(quán)利要求10所述的方法,其特征在于,步驟C2是根據(jù)B2中的信息得到指令間的動態(tài)數(shù)據(jù)依賴關(guān)系;如果B3中的值是變量的值而非變量的地址,則根據(jù)B1中指令和可執(zhí) 行語句間的映射關(guān)系,得到可執(zhí)行語句之間的動態(tài)數(shù)據(jù)依賴關(guān)系。
13. 根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟D所述的可疑度計算公式,需要如下 信息 >Dl.動態(tài)數(shù)據(jù)或動態(tài)控制依賴關(guān)系出現(xiàn)在通過的測試用例中的次數(shù); D2.動態(tài)數(shù)據(jù)或動態(tài)控制依賴關(guān)系出現(xiàn)在失敗的測試用例中的次數(shù); D3.整套測試組件通過的測試用例的個數(shù); D4.整套測試組件失敗的測試用例的個數(shù)。
14. 根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟E所述的報告,為輔助程序員進行軟 件故障定位,按可疑度從大到小排列可執(zhí)行語句,給出了如下信息El.可執(zhí)行語句所在文件名; E2.可執(zhí)行語句所在行號;E3.可執(zhí)行語句所在的動態(tài)控制依賴關(guān)系的個數(shù); E4.可執(zhí)行語句所在的動態(tài)數(shù)據(jù)依賴關(guān)系的個數(shù); E5.可執(zhí)行語句的可疑度;E6.可執(zhí)行語句的可疑度排名。
全文摘要
本發(fā)明公開了一種基于程序動態(tài)依賴關(guān)系的軟件故障定位方法,包括基于作用于鏈接時的優(yōu)化器,獲取靜態(tài)控制依賴信息;動態(tài)插裝可執(zhí)行程序,搜集動態(tài)執(zhí)行軌跡信息;解析軌跡信息,得到動態(tài)依賴關(guān)系;再根據(jù)動態(tài)依賴關(guān)系的可疑度公式,計算每動態(tài)依賴關(guān)系的可疑度;然后將可疑度的值映射到程序的可執(zhí)行語句上;最后將各語句按照可疑度的大小進行降序排列,輸出軟件故障定位的報告。開發(fā)者可以按可疑度從大到小的順序?qū)Υa進行審查,減少程序調(diào)試階段的必須檢查的代碼范圍和數(shù)量,提高定位程序故障的效率。本發(fā)明具有自動化程度高、定位準確度高的優(yōu)點。
文檔編號G06F11/36GK101739339SQ20091024411
公開日2010年6月16日 申請日期2009年12月29日 優(yōu)先權(quán)日2009年12月29日
發(fā)明者李未, 虞凱 申請人:北京航空航天大學