一種基于動態(tài)切片的輕量級錯誤定位技術(shù)實現(xiàn)方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種錯誤定位的方法,主要從動態(tài)切片的過程中提取有用信息,再用 輕量級的方法分析,為程序員提供錯誤語句塊的可疑度排序,屬于軟件測試領(lǐng)域。
【背景技術(shù)】
[0002] 軟件調(diào)試需要程序員進行大量的人機交互。故障定位是調(diào)試過程中最為耗時和費 力的活動之一,它通過審查源程序語義和結(jié)構(gòu),結(jié)合分析程序的執(zhí)行過程及結(jié)果,輔助開發(fā) 人員找到軟件故障位置。研宄人員提出了一系列自動化的故障定位方法,這些方法可分為 靜態(tài)方法和動態(tài)方法。靜態(tài)方法利用程序的依賴關(guān)系、類型約束等信息來分析程序中的可 能故障點;動態(tài)方法則通過測試程序,跟蹤程序的執(zhí)行軌跡和覆蓋信息來進行故障定位。高 效地定位軟件故障可減輕程序員手工排查程序語句的工作量,提升調(diào)試速度和效率。
[0003] 錯誤定位的2個階段:1、找出值得被懷疑的語句2、從這些語句中再確定是否真正 是錯誤語句。由第一階段:高懷疑度語句需要先于低懷疑度語句被檢查。由第二階段:我們 假定只要被程序員檢查的有懷疑的語句都能找出其中的錯誤。錯誤定位方法繁多,但是歸 根結(jié)底可以分為3種:
[0004] 1、基于行為特征對比的方法。2、基礎(chǔ)程序狀態(tài)修改的方法。3、基于程序依賴關(guān)系 的方法。
[0005] 程序行為特征,也被稱為程序頻譜(program spectra),是程序執(zhí)行特征的統(tǒng)計信 息。
[0006] 基礎(chǔ)程序狀態(tài)修改的方法通常在程序執(zhí)行時,獲得并修改程序的狀態(tài),然后觀察 修改后的測試結(jié)果(成功/失敗),進而找出對測試結(jié)果有影響的語句。
[0007] 基于程序依賴關(guān)系的方法,例如符號執(zhí)行,與執(zhí)行實際的目標程序不同它僅依賴 程序的源代碼,以符號代替具體變量的值作為程序的輸入數(shù)據(jù)。這種方法側(cè)重于靜態(tài)分析。 而切片等方法則側(cè)重于使用程序的動態(tài)依賴關(guān)系給出值得懷疑的語句的集合,這個集合除 了包含錯誤語句外,還提供了一個供程序員理解的調(diào)試上下文。但通常這類集合也會包含 一些冗余的語句,需要使用一些技術(shù)來化簡集合。
【發(fā)明內(nèi)容】
[0008] 技術(shù)問題:本發(fā)明的目的是提供一種基于動態(tài)切片的輕量級錯誤定位技術(shù)實現(xiàn)方 法,目前現(xiàn)有的錯誤定位技術(shù)主要從靜態(tài)、動態(tài)和統(tǒng)計這3個方面單獨分析,錯位定位效率 往往不能達到實際的要求。本發(fā)明利用程序切片中的動態(tài)切片方法,在取得程序切片之后 先進行初步的切片分析,然后將結(jié)果送給輕量級錯誤定位模型,進行最后一步的統(tǒng)計分析, 最后得出可疑度語句塊的排名,并且同時保證了高精度和低誤判率。
[0009] 技術(shù)方案:本發(fā)明結(jié)合約束求解器,動態(tài)生成測試用例,再對程序進行動態(tài)切片和 斷點分析,利用切片后的結(jié)果,進行可疑度排序,最終提高錯誤定位的效率。
[0010] 該發(fā)明由5個模塊組成,其中,最頂層是測試用例生成模塊,主要負責測試用例的 自動化生成。中間是程序狀態(tài)修改模塊,主要負責動態(tài)的改變謂詞的結(jié)果,以產(chǎn)生值得進行 切片的關(guān)鍵謂詞。其次是斷點分析模塊、切片分析模塊和可疑度統(tǒng)計模塊。其中,斷點分析 模塊主要負責分析程序崩潰的情況,對無法正常執(zhí)行結(jié)束的程序進行分析,決定了這個發(fā) 明的健壯性。切片分析模塊主要是對依賴圖進行動態(tài)切片,切片之后的結(jié)果以執(zhí)行了程序 哪幾行的形式反饋給用戶,用戶根據(jù)切片結(jié)果,對其進行初步分析。可疑度統(tǒng)計模塊主要負 責計算每條可疑語句塊的可疑度。
[0011] 有益效果:本發(fā)明在對源程序進行切片時,并非漫無目的的尋找切片興趣點,而 是,通過先尋找程序中存在的謂詞,對其結(jié)果進行強制改變,從而使程序的執(zhí)行結(jié)果發(fā)生變 化,從而產(chǎn)生關(guān)鍵謂詞,再對關(guān)鍵謂詞進行切片,大大減少了切片的工作量。其次,本發(fā)明對 程序不包含謂詞的情況也作了詳細的討論,并提出了一種2分斷點算法,精確的計算出程 序崩潰時的切片語句,從而使得本發(fā)明適用于所有的程序。
[0012] 精度高:基于程序頻譜的輕量級錯誤定位方法,往往不考慮程序執(zhí)行的動態(tài)依賴 關(guān)系,所以導致了最后的可疑度語句塊過于龐大。本發(fā)明優(yōu)先對源程序進行切片,將有依賴 關(guān)系包括控制依賴和數(shù)據(jù)依賴的語句塊篩選了出來,然后再進行輕量級分析的時候就不會 產(chǎn)生太多的語句塊。
【附圖說明】
[0013] 圖1是本發(fā)明方案的總體實施流程,包括5大模塊,測試用例生成模塊,程序狀態(tài) 修改模塊,斷點分析模塊,切片分析模塊和可疑度分析模塊。
[0014] 圖2是本發(fā)明的測試用例生成模塊,利用約束求解器生成測試用例并對其進行分 類,最后送入程序狀態(tài)修改模塊。
[0015]圖3是本發(fā)明的程序狀態(tài)修改模塊,主要工作是進行謂詞分析和將部分沒有謂詞 的程序送入斷點分析模塊。
[0016]圖4是本發(fā)明的斷點分析模塊,此模塊負責處理程序崩潰的情況。
[0017] 圖5是本發(fā)明的切片分析模塊,負責生成源程序的切片結(jié)果,切片結(jié)果為執(zhí)行過 哪些和被切語句有關(guān)的語句。
[0018]圖6是本發(fā)明的可疑度分析模塊,主要負責計算所有具有可疑度的語句的具體的 可疑度,此可疑度將直接輔助程序員進行錯誤定位。
【具體實施方式】
[0019] 1.程序狀態(tài)修改
[0020] 1. 1、有謂詞情況
[0021] (1)讀取源程序,每次讀取一行,用正則表達式進行謂詞匹配,并記錄匹配到的謂 詞。若程序無謂詞,則跳轉(zhuǎn)到步驟1.2。
[0022] (2)修改謂詞的取值。修改后有兩種情況:第一種,修改謂詞后程序的執(zhí)行狀態(tài)沒 發(fā)生改變,此時繼續(xù)查找下一個謂詞;第二種,程序的執(zhí)行狀態(tài)發(fā)生改變,這時記錄下使得 程序狀態(tài)發(fā)生改變的謂詞,取得所有謂詞后,執(zhí)行步驟2。
[0023] 1. 2、無謂詞情況:對于錯誤的測試用例,程序的結(jié)果有兩種,第一種是產(chǎn)生錯誤的 輸出結(jié)果,第二是程序無法正常執(zhí)行結(jié)束,中途崩潰報告異常。
[0024] (1)對于第一種,直接從錯誤的輸出結(jié)果的變量開始進行后向切片,得到影響該變 量的語句塊。
[0025] (2)對于第二種,使用二分法設(shè)置斷點,其基本算法是:
【主權(quán)項】
1. 一種基于動態(tài)切片的輕量級錯誤定位方法,其特征在于該方法由5個模塊組成,其 中, 最頂層是測試用例生成模塊,主要負責測試用例的自動化生成。 第二層是程序狀態(tài)修改模塊,主要負責動態(tài)地改變謂詞的結(jié)果,以產(chǎn)生值得進行切片 的關(guān)鍵謂詞。 其余模塊分別是斷點分析模塊、切片分析模塊和可疑度統(tǒng)計模塊;其中,斷點分析模塊 主要負責分析程序崩潰的情況,對內(nèi)存泄漏和堆棧溢出情況下無法正常執(zhí)行結(jié)束的程序進 行分析;切片分析模塊主要是對依賴圖進行動態(tài)切片,切片之后的結(jié)果以執(zhí)行了程序哪幾 行的形式反饋給用戶,用戶根據(jù)切片結(jié)果,對其進行初步分析;可疑度統(tǒng)計模塊主要負責計 算每條可疑語句塊的可疑度。 在對源程序進行切片時,并非漫無目的的尋找切片興趣點,而是,通過先尋找程序中存 在的謂詞,對其結(jié)果進行強制改變,從而使程序的執(zhí)行結(jié)果發(fā)生變化,產(chǎn)生關(guān)鍵謂詞,再對 關(guān)鍵謂詞進行切片,其次,針對程序不包含謂詞的情況提出了一種二分斷點算法,精確的計 算出程序崩潰的時候的切片語句,該方法的具體步驟如下:
1.程序狀態(tài)修改 1. 1、有謂詞情況 1) 讀取源程序,每次讀取一行,用正則表達式進行謂詞匹配,并記錄匹配到的謂詞,若 程序無謂詞,則跳轉(zhuǎn)到步驟1. 2 ; 2) 修改謂詞的取值,修改后有兩種情況:第一種,修改謂詞后程序的執(zhí)行狀態(tài)沒發(fā)生 改變,此時繼續(xù)查找下一個謂詞;第二種,程序的執(zhí)行狀態(tài)發(fā)生改變,這時記錄下使得程序 狀態(tài)發(fā)生改變的謂詞,取得所有謂詞后,執(zhí)行步驟2 ; 1. 2、無謂詞情況:對于錯誤的測試用例,程序的結(jié)果有兩種,第一種是產(chǎn)生錯誤的輸出 結(jié)果,第二種是程序無法正常執(zhí)行結(jié)束,中途程序報錯并崩潰直接退出執(zhí)行,報告異常; 1) 對于第一種,直接從錯誤的輸出結(jié)果的變量開始進行后向切片,得到影響該變量的 語句塊; 2) 對于第二種,使用二分法設(shè)置斷點; 3) 在得到程序執(zhí)行結(jié)束后的最后記錄的斷點和此斷點的前一個記錄的斷點之后,取兩 者之間的最小值,在最小的斷點之后插入一條程序強制停止執(zhí)行的語句,然后再對其進行 切片; 4) 得到程序的切片結(jié)果之后,將其加上1. 2. 3步驟得到的兩個斷點之間的所有語句, 并記錄為新的切片結(jié)果,送入下一個模塊分析; 2、 切片分析: 1) 運行源程序產(chǎn)生源程序的src.be文件; 2) 產(chǎn)生每個基本塊的追蹤代碼; 3) 鏈接動態(tài)庫產(chǎn)生可執(zhí)行exe文件; 4) 運行后綴名為.trace,exe的可執(zhí)行文件,產(chǎn)生切片結(jié)果; 5) 對錯誤的測試用例的切片結(jié)果取交集Uf; 6) 對成功的測試用例的切片結(jié)果取交集Us; 7) 取叫和UJ勺交集Uf+s;再計算UFn=Uf-Uf+s; 8)將Uf+S中的語句設(shè)其可疑度為0;將(UF1)U(UF2) ? ? *U(UFn)=叫中的語句設(shè)其可 疑度為最高100%,可疑度最高的語句將被優(yōu)先檢查,剩下的未被檢查的語句uf,=Uf-叫將 被送到可疑度分析模塊進行下一步分析; 3、 可疑度分析: 1) 可疑度分析矩陣第一列為Uf,的所有語句,這些語句都是切片處理后的語句,相比較 和直接使用統(tǒng)計分析的方法有很大的簡化度; 2) 可疑度分析矩陣第一行為所有執(zhí)行的測試用例; 3) 可疑度分析矩陣的每個元素為執(zhí)行這個測試用例的時候是否執(zhí)行過這條語句,1為 執(zhí)行,〇為未執(zhí)行; 4) 對于每個測試用例的每條語句,計算執(zhí)行了這個語句的失敗和成功的測試用例的個 數(shù),f和s; 5)計算f和s占總失敗測試用例的個數(shù)的比值fail%和占總成功測試用例的比值 success%; 6) 最后計算每條語句的可疑度,公式如下:
4、 錯誤定位 根據(jù)每條語句的可疑度,由高到低,分別檢查每條語句,檢查到錯誤語句后記錄下出錯 語句。
【專利摘要】本發(fā)明是一種基于動態(tài)切片的輕量級錯誤定位方法,最頂層是測試用例生成模塊,主要負責測試用例的自動化生成。第二層是程序狀態(tài)修改模塊,主要負責動態(tài)地改變謂詞的結(jié)果,以產(chǎn)生值得進行切片的關(guān)鍵謂詞。其余模塊分別是斷點分析模塊、切片分析模塊和可疑度統(tǒng)計模塊;其中,斷點分析模塊主要負責分析程序崩潰的情況,對內(nèi)存泄漏和堆棧溢出情況下無法正常執(zhí)行結(jié)束的程序進行分析;切片分析模塊主要是對依賴圖進行動態(tài)切片,切片之后的結(jié)果以執(zhí)行了程序哪幾行的形式反饋給用戶,用戶根據(jù)切片結(jié)果,對其進行初步分析;可疑度統(tǒng)計模塊主要負責計算每條可疑語句塊的可疑度。大大減少了切片的工作量。精確的計算出程序崩潰時候的切片語句。
【IPC分類】G06F11-36
【公開號】CN104572474
【申請?zhí)枴緾N201510050259
【發(fā)明人】張迎周, 滕慶亞, 馬鳳嬌, 居友道, 徐曼青, 高海燕, 徐晨晨, 閆麗
【申請人】南京郵電大學
【公開日】2015年4月29日
【申請日】2015年1月30日