專利名稱:一種空指針異常的自動故障定位方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種軟件故障定位技術(shù),尤其是一種空指針異常的自動故障定位方法。
背景技術(shù):
隨著軟件規(guī)模的擴大和復(fù)雜程度的提高,對軟件健壯性、穩(wěn)定性和可靠性的要求越來越高,軟件的自動故障定位技術(shù)也越來越受到開發(fā)人員的關(guān)注。Java的異常可以分為兩類應(yīng)用異常(在應(yīng)用程序中根據(jù)異常條件顯式地引發(fā))和運行時異常(由Java的實時環(huán)境隱式地引發(fā))。目前針對應(yīng)用異常的研究有很多,例如對應(yīng)用異常進行分析,為程序的測試、維護等任務(wù)為開發(fā)人員提供有價值的信息,但針對運行時異常的研究很少。由于運行時異常的引發(fā)不可預(yù)測,所以開發(fā)人員很少為運行時異常設(shè)計處理程序,因而運行時異常一旦發(fā)生,程序很難通過自身的異常處理機制來處理,經(jīng)常需要人工的干預(yù)來檢查并定位引發(fā)異常的根源。因此當(dāng)在程序的執(zhí)行過程中引發(fā)運行時異常時,如果沒有匹配的異常處理程序來處理,程序立即終止。
空指針異常(java. lang. NullPointerException)是Java異常中很常見的一種運行時異常。在Java中對值為null的對象調(diào)用任何方法,都會引發(fā)空指針異常,空指針異常是Java中最難查找和調(diào)試的一種異常,因此查找空指針異常的引發(fā)原因、并進行定位是一個至關(guān)重要的問題。僅僅使用靜態(tài)方法來檢查程序潛在故障的方法有很多,但這些方法大多要求用戶提供程序的注解且無法解決靜態(tài)分析結(jié)果不精確的問題。采用靜態(tài)分析與動態(tài)信息相結(jié)合的方法是解決靜態(tài)分析結(jié)果不精確問題的一個很有效的方法,但這些方法用于收集動態(tài)信息需要花費很大的代價。發(fā)明內(nèi)容
為了空指針異?,F(xiàn)有的靜態(tài)分析方法存在的不足,本發(fā)明提供一種空指針異常的自動故障定位方法,采用靜態(tài)分析和實時堆棧信息相結(jié)合的方法,自動定位引發(fā)空指針異常的根源,既克服了單獨使用靜態(tài)分析方法導(dǎo)致分析結(jié)果不精確的缺陷,又彌補了實時堆棧信息過于粗糙無法單獨應(yīng)用的不足,同時不需要花費代價收集動態(tài)信息。將該方法應(yīng)用到開放源碼項目中,實驗結(jié)果表明該方法有效。
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是該空指針異常的自動故障定位方法分為三個步驟(I)程序切片,(2)故障定位,包括對切片后的程序進行空指針分析和別名分析,(3)可視化;在步驟(1),從空指針異常的引發(fā)點開始做后向的靜態(tài)切片,利用實時堆棧信息和程序構(gòu)建系統(tǒng)依賴圖,計算系統(tǒng)依賴圖的可達性即可獲得程序切片;首先使用實時堆棧信息分析程序中方法的執(zhí)行情況,然后依據(jù)方法的執(zhí)行情況對執(zhí)行過的方法進行分析,而忽略那些沒有執(zhí)行的方法,從而縮小系統(tǒng)依賴圖的大小,降低靜態(tài)切片的時間和空間消耗,并提高切片的精度;在步驟(2),利用開源軟件Soot對切片后的程序進行靜態(tài)分析 首先進行空指針分析,找出代碼中可能為空值的引用型變量并將其標(biāo)出,以便于找到引發(fā)空指針異常的錯誤值來源,然后再針對引發(fā)空指針異常的對象進行別名分析,充分考慮了別名對引用型變量指向信息的影響,便于能進一步鎖定引發(fā)空指針異常的錯誤語句,從而提高空指針異常故障定位的精度并降低誤報率;在步驟(3),利用自行開發(fā)的可視化工具 CodeDia顯示分析結(jié)果,有利于進行更深入的分析和后期的故障修復(fù)工作。
本發(fā)明的有益效果是采用靜態(tài)分析和實時堆棧信息相結(jié)合的方法,自動定位引發(fā)空指針異常的根源,既克服了單獨使用靜態(tài)分析方法導(dǎo)致分析結(jié)果不精確的缺陷,又彌補了實時堆棧信息過于粗糙無法單獨應(yīng)用的不足,同時不需要花費代價收集動態(tài)信息。將該方法應(yīng)用到開放源碼項目中,實驗結(jié)果表明該方法有效。
下面結(jié)合附圖對本發(fā)明作進一步說明。
圖I是本發(fā)明的系統(tǒng)模型。
圖2是本發(fā)明的實施例可視化顯示結(jié)果。
具體實施方式
在圖I中,該空指針異常的自動故障定位方法分為三個步驟(1)程序切片,(2) 故障定位,包括對切片后的程序進行空指針分析和別名分析,(3)可視化;在步驟(1),從空指針異常的引發(fā)點開始做后向的靜態(tài)切片,利用實時堆棧信息和程序構(gòu)建系統(tǒng)依賴圖, 計算系統(tǒng)依賴圖的可達性即可獲得程序切片;首先使用實時堆棧信息分析程序中方法的執(zhí)行情況,然后依據(jù)方法的執(zhí)行情況對執(zhí)行過的方法進行分析,而忽略那些沒有執(zhí)行的方法, 從而縮小系統(tǒng)依賴圖的大小,降低靜態(tài)切片的時間和空間消耗,并提高切片的精度;在步驟(2),利用開源軟件Soot對切片后的程序進行靜態(tài)分析首先進行空指針分析,找出代碼中可能為空值的引用型變量并將其標(biāo)出,以便于找到引發(fā)空指針異常的錯誤值來源,然后再針對引發(fā)空指針異常的對象進行別名分析,充分考慮了別名對引用型變量指向信息的影響,便于能進一步鎖定引發(fā)空指針異常的錯誤語句,從而提高空指針異常故障定位的精度并降低誤報率;在步驟(3),利用自行開發(fā)的可視化工具CodeDia顯示分析結(jié)果,有利于進行更深入的分析和后期的故障修復(fù)工作。
在圖2中,窗口 I顯示分析結(jié)果(XML格式)在IE瀏覽器中的顯示截圖;窗口 2顯示可視化工具CodeDia載入該結(jié)果文件與項目的源代碼(Ant)之后的程序結(jié)構(gòu)圖,包括包、 類、方法的層次關(guān)系;窗口 3顯示Project類的源代碼;窗口 4顯示AntClassLoader類的源代碼;高亮部分是錯誤定位的結(jié)果。
在窗口 I的分析結(jié)果中,〈Slicelnformation〉標(biāo)簽為根結(jié)點,包含了所有的信息; 〈SourceFile〉標(biāo)簽包含了切片得到的某個類中的行號,Path屬性記錄了類名(文件名); 〈SourceFile〉包含了〈NullUnknown〉和〈AlwaysNull〉兩個子標(biāo)簽,分別記錄了不確定是否為空的行號以及確定為空的行號。
權(quán)利要求
1.一種空指針異常的自動故障定位方法,分為三個步驟(1)程序切片,(2)故障定位,包括對切片后的程序進行空指針分析和別名分析,(3)可視化。
2.根據(jù)權(quán)利要求I所述的一種空指針異常的自動故障定位方法,其特征是在步驟(1),從空指針異常的引發(fā)點開始做后向的靜態(tài)切片,利用實時堆棧信息和程序構(gòu)建系統(tǒng)依賴圖,計算系統(tǒng)依賴圖的可達性即可獲得程序切片;首先使用實時堆棧信息分析程序中方法的執(zhí)行情況,然后依據(jù)方法的執(zhí)行情況對執(zhí)行過的方法進行分析,而忽略那些沒有執(zhí)行的方法。
3.根據(jù)權(quán)利要求I所述的一種空指針異常的自動故障定位方法,其特征是在步驟(2),利用開源軟件Soot對切片后的程序進行靜態(tài)分析首先進行空指針分析,找出代碼中可能為空值的引用型變量并將其標(biāo)出,以便于找到引發(fā)空指針異常的錯誤值來源,然后再針對引發(fā)空指針異常的對象進行別名分析。
4.根據(jù)權(quán)利要求I所述的一種空指針異常的自動故障定位方法,其特征是在步驟(3),利用自行開發(fā)的可視化工具CodeDia顯示分析結(jié)果。
全文摘要
本發(fā)明涉及一種空指針異常的自動故障定位方法,分為三個步驟(1)程序切片,(2)故障定位,包括對切片后的程序進行空指針分析和別名分析,(3)可視化。采用靜態(tài)分析和實時堆棧信息相結(jié)合的方法,自動定位引發(fā)空指針異常的根源,既克服了單獨使用靜態(tài)分析方法導(dǎo)致分析結(jié)果不精確的缺陷,又彌補了實時堆棧信息過于粗糙無法單獨應(yīng)用的不足,同時不需要花費代價收集動態(tài)信息。
文檔編號G06F11/36GK102981953SQ20121044948
公開日2013年3月20日 申請日期2012年11月12日 優(yōu)先權(quán)日2012年11月12日
發(fā)明者姜淑娟, 于巧, 張艷梅, 劉穎祺 申請人:中國礦業(yè)大學(xué)