亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

具有程序分析功能的程序調(diào)試系統(tǒng)的制作方法

文檔序號:6382543閱讀:152來源:國知局

專利名稱::具有程序分析功能的程序調(diào)試系統(tǒng)的制作方法
技術(shù)領(lǐng)域
:本發(fā)明涉及一種程序調(diào)試系統(tǒng),尤其是在軟件調(diào)試和系統(tǒng)維護過程中對程序進行分析和理解的具有程序分析功能的程序調(diào)試系統(tǒng)。
背景技術(shù)
:程序調(diào)試,是將編制的程序投入實際運行前,用手工或編譯程序的方法進行測試,修正語法錯誤和邏輯錯誤的過程。這是保證計算機信息系統(tǒng)正確性的必不可少的步驟。隨著軟件規(guī)模的日益增大,傳統(tǒng)的調(diào)試技術(shù)不能夠有效地處理復(fù)雜大型程序。大型應(yīng)用系統(tǒng)通常有數(shù)百萬行的代碼,程序開發(fā)人員往往不能夠快速的理解程序中代碼,這給程序的調(diào)試和維護工作帶來了很大的困難。在程序調(diào)試中,最常見的工作是發(fā)現(xiàn)一個錯誤并找出所有與該錯誤有關(guān)的語句,動態(tài)程序切片工具可容易地做到這一點。程序切片是一種程序分析技術(shù),用來將大程序分解成小片段,刪除一些與興趣點不相關(guān)的語句,幫助開發(fā)人員從中提取感興趣的部分。其概念和原理由M.Weiser于1979首次建立。使用程序切片技術(shù),將簡化程序分析和理解的難度,加速程序的測試和調(diào)試工作,縮短程序的開發(fā)和維護時間。根據(jù)切片過程對程序某一次具體的輸入的依賴程度,可以將程序切片分為靜態(tài)切片和動態(tài)切片。靜態(tài)切片是指不考慮程序運行時的輸入,完全利用靜態(tài)分析方法得到切片,即通過分析程序的源代碼,計算所有可能輸入情況下的程序切片。靜態(tài)切片考慮了程序中所有的執(zhí)行路徑,包含了所有與興趣點處變量相關(guān)的語句,而不管某些語句在程序?qū)嶋H的執(zhí)行中是否被執(zhí)行,具有很大的冗余性。動態(tài)切片是指在特定輸入下實際影響興趣點變量值或受興趣點變量值影響的所有語句的集合。動態(tài)切片只考慮程序在某個具體輸入下,實際執(zhí)行的路徑中,和興趣點變量相關(guān)的語句。因此,動態(tài)切片的計算過程依賴于程序的具體輸入,每一次的計算工作量較小,得到的切片相對比較精確。
發(fā)明內(nèi)容為了解決現(xiàn)有的調(diào)試技術(shù)不能夠有效地處理復(fù)雜大型程序且程序開發(fā)人員往往不能夠快速的理解程序中代碼的問題,本發(fā)明提供一種具有程序分析功能的程序調(diào)試系統(tǒng),該程序調(diào)試系統(tǒng)不再局限于傳統(tǒng)的程序調(diào)試方式,使調(diào)試不再僅僅只是分析程序當前的運行狀態(tài),該程序調(diào)試系統(tǒng)可以記錄從程序開始執(zhí)行到當前狀態(tài)的軌跡信息,調(diào)試人員可以查看程序完整的執(zhí)行過程,方便的調(diào)試和理解程序;該程序調(diào)試系統(tǒng)還可以記錄程序一次執(zhí)行中的應(yīng)用類和應(yīng)用方法,可以降低調(diào)試人員的關(guān)注范圍;本發(fā)明計算應(yīng)用方法的控制依賴信息,從而可以求得調(diào)試語句的動態(tài)程序切片,可以使調(diào)試人員得到更加精確的調(diào)試信息,同時本系統(tǒng)進行動態(tài)程序切片時不需對程序進行回溯,且只對程序執(zhí)行過程中涉及的方法進行控制依賴分析,能夠提高算法的效率,根據(jù)堆棧信息和控制依賴關(guān)系能夠提高切片的精度。本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是該程序調(diào)試系統(tǒng)針對Java語言,在eclipse環(huán)境中開發(fā),具有標準的調(diào)試功能和擴展的調(diào)試功能。標準的調(diào)試功能包括分步執(zhí)行、設(shè)置斷點、檢查變量和值及掛起和恢復(fù)線程四項功能。擴展的調(diào)試功能包括軌跡分析、應(yīng)用類類層次分析、控制依賴分析及動態(tài)程序切片四項功能。該程序調(diào)試系統(tǒng)的調(diào)試步驟如下(I)與目標虛擬機建立連接。Java程序運行在虛擬機VirtualMachine中,程序調(diào)試系統(tǒng)要對目標程序Target進行調(diào)試,首先要與目標虛擬機TargetVM建立連接,獲得目標虛擬機鏡像TargetVMMirror。實現(xiàn)了VirtualMachine接口,該接口提供了一套方法,可以用來直接或間接地獲取目標虛擬機TargetVM上所有的數(shù)據(jù)和狀態(tài)信息,也可以掛起、恢復(fù)、中止TargetVM,系統(tǒng)因此可以獲取TargetVM上的信息,維持與目標虛擬機的通信,檢查、修改和控制TargetVM上的資源。連接的流程圖如圖I所示。啟動系統(tǒng),獲得目標虛擬機連接器Connector,Connector有共享內(nèi)存連接器ShareMemoryConnector和套接字連接器SocketConnector兩種。不同的Java開發(fā)工具包JDK含有其中的一種或兩種。選擇一種Connector,其中ShareMemoryConnector優(yōu)先,設(shè)置共享地址后進入監(jiān)聽狀態(tài),等待目標虛擬機TargetVM執(zhí)行。監(jiān)聽到TargetVM啟動后,立刻與TargetVM連接,獲得TargetVMMirror;此時,JavaDebugger就可以通過TargetVMMirror對TargetVM進行操縱;為了獲得程序的軌跡信息,需要對目標虛擬機進行事件請求EventRequest設(shè)置,包括ThreadStartRequest、ClassPrepareRequest>MethodEntryRequest及MethodExitRequest,完成事件請求配置后,系統(tǒng)控制目標程序開始執(zhí)行,并對程序執(zhí)行產(chǎn)生的事件進行處理。(2)標準調(diào)試StandardDebugging。與目標虛擬機TargetVM進行連接后,系統(tǒng)可以對目標程序Target進行標準調(diào)試。標準調(diào)試包括分步執(zhí)行Step-by-step、設(shè)置斷點SetBreakpoints、檢查變量和值InspectVariables和掛起/恢復(fù)線程Suspend/resumethreads。四項標準調(diào)試方法分別如下2.I分步執(zhí)行St印-by-st印。分步執(zhí)行是最常見的調(diào)試手段之一,即每次只執(zhí)行一行代碼。采用這種方式,程序調(diào)試人員可以一步一步跟蹤程序執(zhí)行的流程,根據(jù)變量的值,找到錯誤的原因。系統(tǒng)設(shè)置Target分步執(zhí)行Step-by-step的流程圖如圖2所不。系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型。如果事件類型是ThreadStartEvent,獲取事件發(fā)生所在線程的引用threadReference,根據(jù)過濾信息Filter為引用添加類過濾器addClassExclusionFilter,然后設(shè)置線程單步執(zhí)行setStepRequest。此時,發(fā)生事件所在線程開始單步執(zhí)行。當所有的線程都設(shè)置為分步執(zhí)行時,Target單步執(zhí)行。如果事件類型不是ThreadStartEvent,根據(jù)類型調(diào)用相應(yīng)事件的處理方法。設(shè)置斷點SetBreakpoints。設(shè)置斷點是調(diào)試器的功能之一,可以讓程序中斷在需要的地方,從而方便其分析。也可以在一次調(diào)試中設(shè)置斷點,下一次程序運行到斷點位置,便可在上次設(shè)置斷點的位置中斷下來,極大的方便了操作,同時節(jié)省了時間。系統(tǒng)設(shè)置斷點SetBreakpoints的流程圖如圖3所示。系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型。如果事件類型是ClassPrepareEvent,獲取事件產(chǎn)生事件鏡像的引用referenceType。從斷點設(shè)置信息集合BpSetMsgs中取出每一條斷點設(shè)置信息BpSetMsg,查看該信息是否與引用相匹配。如果匹配,則根據(jù)該信息設(shè)置斷點,否則,獲取下一條BpSetMsg,直至每一條信息都取出匹配過。如果事件類型為LocatableEvent,則可以獲取斷點事件請求集合breakpointRequests,根據(jù)程序調(diào)試人員的需要添加新的斷點或刪除已有斷點。如果事件類型不是上述兩種類型,根據(jù)類型調(diào)用相應(yīng)事件的處理方法。檢查變量和值InspectVariables。檢查變量和值是調(diào)試器的基本功能之一,是直接有效的了解程序當前運行狀態(tài)的方式。通過檢查程序在當前運行狀態(tài)下某個變量是否存在以及可見變量的值,程序調(diào)試人員可以判斷程序是否按照合理的方式運行。系統(tǒng)檢查變量和值InspectVariables的流程圖如圖4所示。系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型。如果事件類型是LocatableEvent,則獲取程序當前運行的位置信息Location,從而獲取當前運行類的鏡像referenceType,進而可獲得程序的變量集合fields。fields中保存了當前可見的變量的值。如果事件類型不是上述兩種類型,根據(jù)類型調(diào)用相應(yīng)事件的處理方法。掛起/恢復(fù)線程Suspend/resumethreads。掛起線程是指線程暫時讓出CPU的使用權(quán)限,暫時停止執(zhí)行;恢復(fù)線程是指讓已掛起的線程恢復(fù)執(zhí)行,即從中斷停止處繼續(xù)線程的執(zhí)行。線程掛起時,調(diào)試器可以獲得當前程序運行信息并顯示出來供程序調(diào)試人員參考。系統(tǒng)在進行事件請求設(shè)置setEventRequest時,可以設(shè)置是否在事件發(fā)生后掛起目標虛擬機Target。掛起方式分為三種,分別是SUSPEND_ALL、SUSPEND_EVENT_THREAD以及SUSPEND_N0NE。SUSPEND_ALL指事件發(fā)生時,掛起目標程序當前運行的所有線程;SUSPEND_EVENT_THREAD指事件發(fā)生時,掛起目標程序當前運行線程中產(chǎn)生該事件的線程;SUSPEND_NONE指事件發(fā)生時,目標程序當前運行線程均不掛起。當線程被掛起時,系統(tǒng)可以獲得掛起線程的信息。當信息獲取完畢,系統(tǒng)恢復(fù)掛起線程,目標程序繼續(xù)執(zhí)行。(3)擴展調(diào)試ExtendedDebugging。與目標虛擬機TargetVM進行連接后,系統(tǒng)可以結(jié)合標準調(diào)試StandardDebugging,實現(xiàn)對目標程序Target的擴展調(diào)試功能。擴展調(diào)試包括軌跡分析TraceAnalysis、應(yīng)用類類層次分析HierarchyAnalysis、控制依賴分析ControlDependenceAnalysis及動態(tài)程序切片DynamicSlice。四項擴展調(diào)試方法分別如下3.I軌跡分析TraceAnalysis。系統(tǒng)獲得程序在一次輸入下的軌跡信息,包括軌跡Trace以及應(yīng)用類集和應(yīng)用方法集appClassesandappMethods。軌跡Trace是一個鍵值對集合Collection〈Seq,TraceNode〉,記錄程序的執(zhí)行過程。Seq是執(zhí)行序號,表示TraceNode產(chǎn)生的順序。TraceNode是軌跡節(jié)點,記錄程序每一步的執(zhí)行情況。依據(jù)執(zhí)行情況的不同,TraceNode的類型分為三種,分別是NormalTraceNode、MethodEntryTraceNode和MethodExitTraceNode。每一個Seq對應(yīng)一個TraceNode。應(yīng)用類集和應(yīng)用方法集appClassesandappMethods是程序在執(zhí)行過程中實際使用的類和方法。應(yīng)用類集appClasses包括的信息為程序執(zhí)行時使用的類的類名,應(yīng)用方法集appMethods包括的信息為程序執(zhí)行時使用的方法的詳細信息MethodInfo,如方法名、方法參數(shù)信息及方法返回值信息。軌跡分析的流程圖如圖5所示,程序在執(zhí)行過程中不停的產(chǎn)生事件,系統(tǒng)對其中部分事件進行分析處理,以求獲得完整的軌跡信息。當生成的事件為ThreadStartEvent時,系統(tǒng)設(shè)置該目標程序單步執(zhí)行setStepRequest。當生成的事件為MethodEntryEvent時,表示程序進入一個方法。此時,獲得被進入的方法的信息Methodlnfo,生成MethodEntryTraceNode,添加到Trace中。當生成的事件為MethodExitEvent時,表不程序離開一個方法。此時,獲得離開的方法的信息Methodlnfo,生成MethodExitTraceNode,添加到Trace中。當生成的事件為StepEvent時,獲取當前準備執(zhí)行語句的節(jié)點信息NodeInfo,包括類名、方法名及行號,生成NormalTraceNode,添加到Trace中。同時,根據(jù)切片準則,判斷是否到達切片處,如果沒有到達,繼續(xù)進行事件處理。否則,結(jié)束TraceAnalysis,獲得軌跡信息。當生成事件為VMDisconnectEvent時,表示系統(tǒng)與TargetVM斷開連接,系統(tǒng)進行結(jié)束處理。事件生成時,系統(tǒng)設(shè)置目標虛擬機掛起產(chǎn)生事件的線程。當完成對應(yīng)事件的處理后,線程恢復(fù)繼續(xù)執(zhí)行。應(yīng)用類類層次分析HierarchyAnalysis。完成軌跡分析后,得到程序在一次輸入下的應(yīng)用類集appClasses。該模塊建立appClasses的類層次圖HierarchyGraph。準確的說,類層次圖HierarchyGraph是森林,記錄了appClasses之間的繼承關(guān)系。森林中的每一棵樹是具有同一父類的類的集合,其中根節(jié)點是樹中所有節(jié)點的父類,父節(jié)點是子節(jié)點的父類,子節(jié)點是父節(jié)點的派生類。HierarchyGraph中的節(jié)點是類名,邊表示類的繼承關(guān)系。應(yīng)用類類層次分析HierarchyAnalysis的流程如圖6所示。首先初始化HierarchyGraph,為HierarchyGraph添加節(jié)點,每個節(jié)點為appClass。遍歷HierarchyGraph,對每一個節(jié)點appClass,在appClasses中查找它的父類superclass和接口集合interfaces,并在HierarchyGraph中添加從appClass到superclass和interfaces的繼承邊。遍歷HierarchyGraph完成,HierarchyGraph建立完成??刂埔蕾嚪治鯟ontrolDependenceAnalysis。該模塊計算程序運行時遇到的每一個應(yīng)用方法appMethod的控制依賴ControlDependence,以下簡稱CD??刂埔蕾囉糜诒硎居捎诳刂屏饕鸬某绦?qū)嶓w之間的關(guān)系,它的定義如下令G是一個控制流圖,nl和n2是G中的節(jié)點,若下列三個條件滿足,則n2控制依賴nl,記為CD(n2,nl)。)從n2到nl之間存在一條可執(zhí)行路徑P;2)對P上除nl,n2外的每個節(jié)點n,節(jié)點n2都是它的后必經(jīng)節(jié)點;3)節(jié)點n2不是節(jié)點nl的后必經(jīng)節(jié)點。控制依賴分析ControlDependenceAnalysis的流程如圖7所示。取出appMethods中的每一個方法appMethod,分析生成方法的控制流圖ControlFlowGraph,以下簡稱CFG。對CFG取逆,得到appMethod的逆控制流圖inverseCFG。通過對inverseCFG進行支配關(guān)系分析,得到appMethod的后必經(jīng)樹Post-DominatedTree,以下簡稱F1DTtj由后必經(jīng)樹PDT生成控制依賴⑶的流程圖如圖8所示。首先獲取控制流圖CFG中符合特定條件的邊的集合Collection(A,B),特定條件為TOT中B不是A的祖先。然后取出每一條特定邊(A,B),計算A和B的共同祖先L。如果L是A,則查找所有TOT中從A到B路徑上的點(Nodes,包括A但不包括B),記錄Nodes到A的控制依賴關(guān)系。否則,查找所有PDT中從L到B路徑上的點(Nodes,包括B但不包括L),記錄Nodes到A的控制依賴關(guān)系。所有的邊處理完成后,方法的控制依賴求解完畢。程序切片Slice。該模塊計算程序運行過程中每一條語句、每一個變量的動態(tài)程序切片。當程序執(zhí)行到某一條語句時,通過軌跡分析TraceAnalysis,系統(tǒng)獲得了程序的軌跡信息;通過控制依賴分析,系統(tǒng)獲得了應(yīng)用方法集appMethods中各個方法的控制依賴信息。該模塊在前面各個模塊分析的基礎(chǔ)上完成動態(tài)程序切片功能;該模塊是系統(tǒng)的核心模塊。程序切片Slice的流程如圖9所示。系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型。如果事件類型是MethodEntryEvent,表示程序進入一個方法method。生成軌跡節(jié)點MethodEntryTraceNode,將其添加到軌跡Trace中。獲取方法的堆棧信息frames,計算進入方法的控制依賴信息CD,生成方法的調(diào)用點信息callNode。程序計算完成方法的CD后,將該方法及對應(yīng)的CD保存起來。當程序在該次執(zhí)行過程中又一次進入該方法時,可以將查看之前的控制依賴記錄,直接找到該方法的CD,不需要重復(fù)計算。生成調(diào)用點/[目息callNode的流程圖如圖10所不。系統(tǒng)首先獲得廣生MethodEntryEvent的線程引用threadReference,并從中得到該線程的調(diào)用堆棧信息。根據(jù)堆棧信息后向遍歷軌跡Trace,獲取調(diào)用軌跡節(jié)點callTraceNode。對調(diào)用軌跡節(jié)點對應(yīng)源碼進行靜態(tài)分析,包括參數(shù)分析及返回值分析,將得到的結(jié)果與callTraceNode結(jié)合生成方法的調(diào)用點信息callNode。建立并初始化LiveMethodInfo,用于維護和支持對該方法內(nèi)的語句和變量進行切片。在LiveMethodInfo中,生成Slice0fThis2和Slice0fParams2o其中Slice0fThis2記錄了調(diào)用對象本身切片與形式化的對象切片,SliceOfParamd記錄了程序參數(shù)中為引用類型的實參切片和形參切片。之后,生成變量切片集合SliceOfVars和節(jié)點切片集合SliceOfNodes,SliceOfVars記錄了method中除靜態(tài)變量StaticVar外所有變量的切片,SliceOfNodes記錄了method中所有語句的切片。完成后,將LiveMethodInfo添加到棧Imis中。如果事件類型是StepEvent,表示程序執(zhí)行一條語句node。生成軌跡節(jié)點NormalTraceNode,并將其添加到軌跡Trace中。生成并初始化節(jié)點切片nodeSlice。判斷該語句是否有控制依賴節(jié)點,如果有,查找當前控制依賴節(jié)點的切片SliceOfCD,添加到nodeSlice,更新nodeSlice的調(diào)用&控制切片sliceOfPreds。如果沒有,添加SliceOfCallPreds到nodeSlice,更新nodeSlice的調(diào)用&控制切片sliceOfPreds。由于語句本身包含的信息量較大且復(fù)雜,對語句本身進行分析的困難度比較高。為了降低語句分析的難度同時保證語句分析的正確性,需要將一條語句轉(zhuǎn)換成多條三地址碼,對三地址碼進行分析和切片操作。系統(tǒng)利用Soot將語句轉(zhuǎn)換成具有三地址代碼格式的Jimple代碼,一條Java語句被轉(zhuǎn)換成多條Jimple語句,系統(tǒng)對一條Java語句node的操作處轉(zhuǎn)換為對多條Jimple語句units的處理。取出每一條Jimple語句unit,判斷它是否為返回語句RetUnit。如果unit是RetUnit,進行返回值切片SliceOfRet處理。否則,對語句進行變量分析,得到使用變量集合useVars和定義變量集合defVars。對于useVars中的每一個變量useVar,添加它的切片varSlice到nodeSlice中。對于defVars中的每一個變量defVar,添加nodeSlice到它的切片varSlice中。所有的Jimple語句完成后,一個node的切片完成。此時,將nodeSlice添加到SliceOfNodes中,完成一條語句的切片。如果事件類型是MethodExitEvent,表示程序退出一個方法method。生成軌跡節(jié)點MethodExitTraceNode,并將其添加到軌跡Trace中。之后,完成LiveMethodInfo的整理工作,包括更新this的切片結(jié)果、更新引用實參的切片結(jié)果;最后,棧Imis執(zhí)行出棧操作。本發(fā)明的有益效果是,該程序調(diào)試系統(tǒng)不再局限于傳統(tǒng)的程序調(diào)試方式,使調(diào)試不再僅僅只是分析程序當前的運行狀態(tài),該程序調(diào)試系統(tǒng)可以記錄從程序開始執(zhí)行到當前狀態(tài)的軌跡信息,調(diào)試人員可以查看程序完整的執(zhí)行過程,方便的調(diào)試和理解程序;該程序調(diào)試系統(tǒng)還可以記錄程序一次執(zhí)行中的應(yīng)用類和應(yīng)用方法,可以降低調(diào)試人員的關(guān)注范圍;本發(fā)明計算應(yīng)用方法的控制依賴信息,從而可以求得調(diào)試語句的動態(tài)程序切片,可以使調(diào)試人員得到更加精確的調(diào)試信息,同時本系統(tǒng)進行動態(tài)程序切片時不需對程序進行回溯,且只對程序執(zhí)行過程中涉及的方法進行控制依賴分析,能夠提高算法的效率,根據(jù)堆棧信息和控制依賴關(guān)系能夠提高切片的精度。下面結(jié)合附圖和實施例對本發(fā)明作進一步說明。圖I是連接的流程示意圖。圖2是分步執(zhí)行的流程示意圖。圖3設(shè)置斷點的流程圖。圖4檢查變量和值的流程圖。圖5軌跡分析的流程圖。圖6應(yīng)用類類層次分析流程圖。圖7控制依賴分析流程圖。圖8后必經(jīng)樹生成控制依賴流程圖。圖9程序切片流程圖。圖10生成調(diào)用點信息流程圖。具體實施例方式該程序調(diào)試系統(tǒng)針對Java語言,在eclipse環(huán)境中開發(fā),具有標準的調(diào)試功能和擴展的調(diào)試功能。標準的調(diào)試功能包括分步執(zhí)行、設(shè)置斷點、檢查變量和值及掛起和恢復(fù)線程四項功能。擴展的調(diào)試功能包括軌跡分析、應(yīng)用類類層次分析、控制依賴分析及動態(tài)程序切片四項功能。該程序調(diào)試系統(tǒng)的調(diào)試步驟如下(I)與目標虛擬機建立連接。Java程序運行在虛擬機VirtualMachine中,程序調(diào)試系統(tǒng)要對目標程序Target進行調(diào)試,首先要與目標虛擬機TargetVM建立連接,獲得目標虛擬機鏡像TargetVMMirror。實現(xiàn)了VirtualMachine接口,該接口提供了一套方法,可以用來直接或間接地獲取目標虛擬機TargetVM上所有的數(shù)據(jù)和狀態(tài)信息,也可以掛起、恢復(fù)、中止TargetVM,系統(tǒng)因此可以獲取TargetVM上的信息,維持與目標虛擬機的通信,檢查、修改和控制TargetVM上的資源。連接的流程圖如圖I所示。啟動系統(tǒng),獲得目標虛擬機連接器Connector,Connector有共享內(nèi)存連接器ShareMemoryConnector和套接字連接器SocketConnector兩種。不同的Java開發(fā)工具包JDK含有其中的一種或兩種。選擇一種Connector,其中ShareMemoryConnector優(yōu)先,設(shè)置共享地址后進入監(jiān)聽狀態(tài),等待目標虛擬機TargetVM執(zhí)行。監(jiān)聽到TargetVM啟動后,立刻與TargetVM連接,獲得TargetVMMirror;此時,JavaDebugger就可以通過TargetVMMirror對TargetVM進行操縱;為了獲得程序的軌跡信息,需要對目標虛擬機進行事件請求EventRequest設(shè)置,包括ThreadStartRequest、ClassPrepareRequest>MethodEntryRequest及MethodExitRequest,完成事件請求配置后,系統(tǒng)控制目標程序開始執(zhí)行,并對程序執(zhí)行產(chǎn)生的事件進行處理。(2)標準調(diào)試StandardDebugging。與目標虛擬機TargetVM進行連接后,系統(tǒng)可以對目標程序Target進行標準調(diào)試。標準調(diào)試包括分步執(zhí)行Step-by-step、設(shè)置斷點SetBreakpoints、檢查變量和值InspectVariables和掛起/恢復(fù)線程Suspend/resumethreads。四項標準調(diào)試方法分別如下2.I分步執(zhí)行St印-by-st印。分步執(zhí)行是最常見的調(diào)試手段之一,即每次只執(zhí)行一行代碼。采用這種方式,程序調(diào)試人員可以一步一步跟蹤程序執(zhí)行的流程,根據(jù)變量的值,找到錯誤的原因。系統(tǒng)設(shè)置Target分步執(zhí)行Step-by-step的流程圖如圖2所示。系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型。如果事件類型是ThreadStartEvent,獲取事件發(fā)生所在線程的引用threadReference,根據(jù)過濾信息Filter為引用添加類過濾器addClassExclusionFilter,然后設(shè)置線程單步執(zhí)行setStepRequest。此時,發(fā)生事件所在線程開始單步執(zhí)行。當所有的線程都設(shè)置為分步執(zhí)行時,Target單步執(zhí)行。如果事件類型不是ThreadStartEvent,根據(jù)類型調(diào)用相應(yīng)事件的處理方法。設(shè)置斷點SetBreakpoints。設(shè)置斷點是調(diào)試器的功能之一,可以讓程序中斷在需要的地方,從而方便其分析。也可以在一次調(diào)試中設(shè)置斷點,下一次程序運行到斷點位置,便可在上次設(shè)置斷點的位置中斷下來,極大的方便了操作,同時節(jié)省了時間。系統(tǒng)設(shè)置斷點SetBreakpoints的流程圖如圖3所示。系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型。如果事件類型是ClassPrepareEvent,獲取事件產(chǎn)生事件鏡像的引用referenceType。從斷點設(shè)置信息集合BpSetMsgs中取出每一條斷點設(shè)置信息BpSetMsg,查看該信息是否與引用相匹配。如果匹配,則根據(jù)該信息設(shè)置斷點,否則,獲取下一條BpSetMsg,直至每一條信息都取出匹配過。如果事件類型為LocatableEvent,則可以獲取斷點事件請求集合breakpointRequests,根據(jù)程序調(diào)試人員的需要添加新的斷點或刪除已有斷點。如果事件類型不是上述兩種類型,根據(jù)類型調(diào)用相應(yīng)事件的處理方法。檢查變量和值InspectVariables。檢查變量和值是調(diào)試器的基本功能之一,是直接有效的了解程序當前運行狀態(tài)的方式。通過檢查程序在當前運行狀態(tài)下某個變量是否存在以及可見變量的值,程序調(diào)試人員可以判斷程序是否按照合理的方式運行。系統(tǒng)檢查變量和值InspectVariables的流程圖如圖4所示。系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型。如果事件類型是LocatableEvent,則獲取程序當前運行的位置信息Location,從而獲取當前運行類的鏡像referenceType,進而可獲得程序的變量集合fields。fields中保存了當前可見的變量的值。如果事件類型不是上述兩種類型,根據(jù)類型調(diào)用相應(yīng)事件的處理方法。掛起/恢復(fù)線程Suspend/resumethreads。掛起線程是指線程暫時讓出CPU的使用權(quán)限,暫時停止執(zhí)行;恢復(fù)線程是指讓已掛起的線程恢復(fù)執(zhí)行,即從中斷停止處繼續(xù)線程的執(zhí)行。線程掛起時,調(diào)試器可以獲得當前程序運行信息并顯示出來供程序調(diào)試人員參考。系統(tǒng)在進行事件請求設(shè)置setEventRequest時,可以設(shè)置是否在事件發(fā)生后掛起目標虛擬機Target。掛起方式分為三種,分別是SUSPEND_ALL、SUSPEND_EVENT_THREAD以及SUSPEND_N0NE。SUSPEND_ALL指事件發(fā)生時,掛起目標程序當前運行的所有線程;SUSPEND_EVENT_THREAD指事件發(fā)生時,掛起目標程序當前運行線程中產(chǎn)生該事件的線程;SUSPEND_NONE指事件發(fā)生時,目標程序當前運行線程均不掛起。當線程被掛起時,系統(tǒng)可以獲得掛起線程的信息。當信息獲取完畢,系統(tǒng)恢復(fù)掛起線程,目標程序繼續(xù)執(zhí)行。(3)擴展調(diào)試ExtendedDebugging。與目標虛擬機TargetVM進行連接后,系統(tǒng)可以結(jié)合標準調(diào)試StandardDebugging,實現(xiàn)對目標程序Target的擴展調(diào)試功能。擴展調(diào)試包括軌跡分析TraceAnalysis、應(yīng)用類類層次分析HierarchyAnalysis、控制依賴分析ControlDependenceAnalysis及動態(tài)程序切片DynamicSlice。四項擴展調(diào)試方法分別如下3.I軌跡分析TraceAnalysis。系統(tǒng)獲得程序在一次輸入下的軌跡信息,包括軌跡Trace以及應(yīng)用類集和應(yīng)用方法集appClassesandappMethods。軌跡Trace是一個鍵值對集合Collection〈Seq,TraceNode〉,記錄程序的執(zhí)行過程。Seq是執(zhí)行序號,表示TraceNode產(chǎn)生的順序。TraceNode是軌跡節(jié)點,記錄程序每一步的執(zhí)行情況。依據(jù)執(zhí)行情況的不同,TraceNode的類型分為三種,分別是NormalTraceNode、MethodEntryTraceNode和MethodExitTraceNode。每一個Seq對應(yīng)一個TraceNode。應(yīng)用類集和應(yīng)用方法集appClassesandappMethods是程序在執(zhí)行過程中實際使用的類和方法。應(yīng)用類集appClasses包括的信息為程序執(zhí)行時使用的類的類名,應(yīng)用方法集appMethods包括的信息為程序執(zhí)行時使用的方法的詳細信息Methodlnfo,如方法名、方法參數(shù)信息及方法返回值信息。軌跡分析的流程圖如圖5所示,程序在執(zhí)行過程中不停的產(chǎn)生事件,系統(tǒng)對其中部分事件進行分析處理,以求獲得完整的軌跡信息。當生成的事件為ThreadStartEvent時,系統(tǒng)設(shè)置該目標程序單步執(zhí)行setStepRequest。當生成的事件為MethodEntryEvent時,表示程序進入一個方法。此時,獲得被進入的方法的信息Methodlnfo,生成MethodEntryTraceNode,添加到Trace中。當生成的事件為MethodExitEvent時,表不程序離開一個方法。此時,獲得離開的方法的信息Methodlnfo,生成MethodExitTraceNode,添加到Trace中。當生成的事件為StepEvent時,獲取當前準備執(zhí)行語句的節(jié)點信息NodeInfo,包括類名、方法名及行號,生成NormalTraceNode,添加到Trace中。同時,根據(jù)切片準則,判斷是否到達切片處,如果沒有到達,繼續(xù)進行事件處理。否則,結(jié)束TraceAnalysis,獲得軌跡信息。當生成事件為VMDisconnectEvent時,表示系統(tǒng)與TargetVM斷開連接,系統(tǒng)進行結(jié)束處理。事件生成時,系統(tǒng)設(shè)置目標虛擬機掛起產(chǎn)生事件的線程。當完成對應(yīng)事件的處理后,線程恢復(fù)繼續(xù)執(zhí)行。應(yīng)用類類層次分析HierarchyAnalysis。完成軌跡分析后,得到程序在一次輸入下的應(yīng)用類集appClasses。該模塊建立appClasses的類層次圖HierarchyGraph。準確的說,類層次圖HierarchyGraph是森林,記錄了appClasses之間的繼承關(guān)系。森林中的每一棵樹是具有同一父類的類的集合,其中根節(jié)點是樹中所有節(jié)點的父類,父節(jié)點是子節(jié)點的父類,子節(jié)點是父節(jié)點的派生類。HierarchyGraph中的節(jié)點是類名,邊表示類的繼承關(guān)系。應(yīng)用類類層次分析HierarchyAnalysis的流程如圖6所示。首先初始化HierarchyGraph,為HierarchyGraph添加節(jié)點,每個節(jié)點為appClass。遍歷HierarchyGraph,對每一個節(jié)點appClass,在appClasses中查找它的父類superclass和接口集合interfaces,并在HierarchyGraph中添加從appClass到superclass和interfaces的繼承邊。遍歷HierarchyGraph完成,HierarchyGraph建立完成。控制依賴分析ControlDependenceAnalysis。該模塊計算程序運行時遇到的每一個應(yīng)用方法appMethod的控制依賴ControlDependence,以下簡稱CD。控制依賴用于表示由于控制流引起的程序?qū)嶓w之間的關(guān)系,它的定義如下令G是一個控制流圖,nl和n2是G中的節(jié)點,若下列三個條件滿足,則n2控制依賴nl,記為CD(n2,nl)。)從n2到nl之間存在一條可執(zhí)行路徑P;5)對P上除nl,n2外的每個節(jié)點n,節(jié)點n2都是它的后必經(jīng)節(jié)點;6)節(jié)點n2不是節(jié)點nl的后必經(jīng)節(jié)點??刂埔蕾嚪治鯟ontrolDependenceAnalysis的流程如圖7所示。取出appMethods中的每一個方法appMethod,分析生成方法的控制流圖ControlFlowGraph,以下簡稱CFG。對CFG取逆,得到appMethod的逆控制流圖inverseCFG。通過對inverseCFG進行支配關(guān)系分析,得到appMethod的后必經(jīng)樹Post-DominatedTree,以下簡稱F1DTtj由后必經(jīng)樹PDT生成控制依賴⑶的流程圖如圖8所示。首先獲取控制流圖CFG中符合特定條件的邊的集合Collection(A,B),特定條件為TOT中B不是A的祖先。然后取出每一條特定邊(A,B),計算A和B的共同祖先L。如果L是A,則查找所有TOT中從A到B路徑上的點(Nodes,包括A但不包括B),記錄Nodes到A的控制依賴關(guān)系。否則,查找所有PDT中從L到B路徑上的點(Nodes,包括B但不包括L),記錄Nodes到A的控制依賴關(guān)系。所有的邊處理完成后,方法的控制依賴求解完畢。程序切片Slice。該模塊計算程序運行過程中每一條語句、每一個變量的動態(tài)程序切片。當程序執(zhí)行到某一條語句時,通過軌跡分析TraceAnalysis,系統(tǒng)獲得了程序的軌跡信息;通過控制依賴分析,系統(tǒng)獲得了應(yīng)用方法集appMethods中各個方法的控制依賴信息。該模塊在前面各個模塊分析的基礎(chǔ)上完成動態(tài)程序切片功能;該模塊是系統(tǒng)的核心模塊。程序切片Slice的流程如圖9所示。系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型。如果事件類型是MethodEntryEvent,表示程序進入一個方法method。生成軌跡節(jié)點MethodEntryTraceNode,將其添加到軌跡Trace中。獲取方法的堆棧信息frames,計算進入方法的控制依賴信息CD,生成方法的調(diào)用點信息callNode。程序計算完成方法的CD后,將該方法及對應(yīng)的CD保存起來。當程序在該次執(zhí)行過程中又一次進入該方法時,可以將查看之前的控制依賴記錄,直接找到該方法的CD,不需要重復(fù)計算。生成調(diào)用點/[目息callNode的流程圖如圖10所不。系統(tǒng)首先獲得廣生MethodEntryEvent的線程引用threadReference,并從中得到該線程的調(diào)用堆棧信息。根據(jù)堆棧信息后向遍歷軌跡Trace,獲取調(diào)用軌跡節(jié)點callTraceNode。對調(diào)用軌跡節(jié)點對應(yīng)源碼進行靜態(tài)分析,包括參數(shù)分析及返回值分析,將得到的結(jié)果與callTraceNode結(jié)合生成方法的調(diào)用點信息callNode。建立并初始化LiveMethodInfo,用于維護和支持對該方法內(nèi)的語句和變量進行切片。在LiveMethodInfo中,生成Slice0fThis2和Slice0fParams2o其中Slice0fThis2記錄了調(diào)用對象本身切片與形式化的對象切片,SliceOfParamd記錄了程序參數(shù)中為引用類型的實參切片和形參切片。之后,生成變量切片集合SliceOfVars和節(jié)點切片集合SliceOfNodes,SliceOfVars記錄了method中除靜態(tài)變量StaticVar外所有變量的切片,SliceOfNodes記錄了method中所有語句的切片。完成后,將LiveMethodInfo添加到棧Imis中。如果事件類型是StepEvent,表示程序執(zhí)行一條語句node。生成軌跡節(jié)點NormalTraceNode,并將其添加到軌跡Trace中。生成并初始化節(jié)點切片nodeSlice。判斷該語句是否有控制依賴節(jié)點,如果有,查找當前控制依賴節(jié)點的切片SliceOfCD,添加到nodeSlice,更新nodeSlice的調(diào)用&控制切片sliceOfPreds。如果沒有,添加SliceOfCallPreds到nodeSlice,更新nodeSlice的調(diào)用&控制切片sliceOfPreds。由于語句本身包含的信息量較大且復(fù)雜,對語句本身進行分析的困難度比較高。為了降低語句分析的難度同時保證語句分析的正確性,需要將一條語句轉(zhuǎn)換成多條三地址碼,對三地址碼進行分析和切片操作。系統(tǒng)利用Soot將語句轉(zhuǎn)換成具有三地址代碼格式的Jimple代碼,一條Java語句被轉(zhuǎn)換成多條Jimple語句,系統(tǒng)對一條Java語句node的操作處轉(zhuǎn)換為對多條Jimple語句units的處理。取出每一條Jimple語句unit,判斷它是否為返回語句RetUnit。如果unit是RetUnit,進行返回值切片SliceOfRet處理。否則,對語句進行變量分析,得到使用變量集合useVars和定義變量集合defVars。對于useVars中的每一個變量useVar,添加它的切片varSlice到nodeSlice中。對于defVars中的每一個變量defVar,添加nodeSlice到它的切片varSlice中。所有的Jimple語句完成后,一個node的切片完成。此時,將nodeSlice添加到SliceOfNodes中,完成一條語句的切片。如果事件類型是MethodExitEvent,表示程序退出一個方法method。生成軌跡節(jié)點MethodExitTraceNode,并將其添加到軌跡Trace中。之后,完成LiveMethodInfo的整理工作,包括更新this的切片結(jié)果、更新引用實參的切片結(jié)果;最后,棧Imis執(zhí)行出棧操作。權(quán)利要求1.具有程序分析功能的程序調(diào)試系統(tǒng),該程序調(diào)試系統(tǒng)的調(diào)試步驟包括與目標虛擬機建立連接、標準調(diào)試及擴展調(diào)試,其特征在于,與目標虛擬機建立連接,Java程序運行在虛擬機VirtualMachine中,程序調(diào)試系統(tǒng)要對目標程序Target進行調(diào)試,首先要與目標虛擬機TargetVM建立連接,獲得目標虛擬機鏡像TargetVMMirror;TargetVMMirror實現(xiàn)了VirtualMachine接口,該接口提供了一套方法,可以用來直接或間接地獲取目標虛擬機TargetVM上所有的數(shù)據(jù)和狀態(tài)信息,也可以掛起、恢復(fù)、中止TargetVM,系統(tǒng)因此可以獲取TargetVM上的信息,維持與目標虛擬機的通信,檢查、修改和控制TargetVM上的資源;啟動系統(tǒng),獲得目標虛擬機連接器Connector,Connector有共享內(nèi)存連接器ShareMemoryConnector和套接字連接器SocketConnector兩種;選擇一種Connector,其中ShareMemoryConnector優(yōu)先,設(shè)置共享地址后進入監(jiān)聽狀態(tài),等待目標虛擬機TargetVM執(zhí)行;Connector監(jiān)聽到TargetVM啟動后,立刻與TargetVM連接,獲得TargetVMMirror;此時,JavaDebugger就可以通過TargetVMMirror對TargetVM進行操縱;為了獲得程序的軌跡信息,需要對目標虛擬機進行事件請求EventRequest設(shè)置,包括ThreadStartRequest、ClassPrepareRequest>MethodEntryRequest及MethodExitRequest,完成事件請求配置后,系統(tǒng)控制目標程序開始執(zhí)行,并對程序執(zhí)行產(chǎn)生的事件進行處理;標準調(diào)試,與目標虛擬機TargetVM進行連接后,系統(tǒng)可以對目標程序Target進行標準調(diào)試;標準調(diào)試包括分步執(zhí)行Step-by-step、設(shè)置斷點SetBreakpoints、檢查變量和值InspectVariables和掛起/恢復(fù)線程Suspend/resumethreads;擴展調(diào)試,與目標虛擬機TargetVM進行連接后,系統(tǒng)可以結(jié)合標準調(diào)試StandardDebugging,實現(xiàn)對目標程序Target的擴展調(diào)試功能;擴展調(diào)試包括軌跡分析TraceAnalysis、應(yīng)用類類層次分析HierarchyAnalysis、控制依賴分析ControlDependenceAnalysis及動態(tài)程序切片DynamicSlice。2.根據(jù)權(quán)利要求I所述的標準調(diào)試中的分步執(zhí)行Step-by-step,其特征在于,系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型,如果事件類型是ThreadStartEvent,獲取事件發(fā)生所在線程的引用threadReference,根據(jù)過濾信息Filter為引用添加類過濾器addClassExclusionFilter,然后設(shè)置線程單步執(zhí)行setStepRequest;此時,發(fā)生事件所在線程開始單步執(zhí)行;當所有的線程都設(shè)置為分步執(zhí)行時,Target單步執(zhí)行;如果事件類型不是ThreadStartEvent,根據(jù)類型調(diào)用相應(yīng)事件的處理方法。3.根據(jù)權(quán)利要求I所述的標準調(diào)試中的設(shè)置斷點SetBreakpoints,其特征在于,系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型;如果事件類型是ClassPrepareEvent,獲取事件產(chǎn)生事件鏡像的引用referenceType;從斷點設(shè)置信息集合BpSetMsgs中取出每一條斷點設(shè)置信息BpSetMsg,查看該信息是否與引用相匹配;如果匹配,則根據(jù)該信息設(shè)置斷點,否則,獲取下一條BpSetMsg,直至每一條信息都取出匹配過;如果事件類型為LocatableEvent,則可以獲取斷點事件請求集合breakpointRequests,根據(jù)程序調(diào)試人員的需要添加新的斷點或刪除已有斷點;如果事件類型不是上述兩種類型,根據(jù)類型調(diào)用相應(yīng)事件的處理方法。4.根據(jù)權(quán)利要求I所述的標準調(diào)試中的檢查變量和值InspectVariables,其特征在于,系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型;如果事件類型是LocatableEvent,則獲取程序當前運行的位置信息Location,從而獲取當前運行類的鏡像referenceType,進而可獲得程序的變量集合fields;fields中保存了當前可見的變量的值;如果事件類型不是上述兩種類型,根據(jù)類型調(diào)用相應(yīng)事件的處理方法。5.根據(jù)權(quán)利要求I所述的標準調(diào)試中的掛起/恢復(fù)線程Suspend/resumethreads,其特征在于,掛起方式分為三種,分別是SUSPEND_ALL、SUSPEND_EVENT_THREAD以及SUSPEND_NONE;SUSPEND_ALL指事件發(fā)生時,掛起目標程序當前運行的所有線程;SUSPEND_EVENT_THREAD指事件發(fā)生時,掛起目標程序當前運行線程中產(chǎn)生該事件的線程;SUSPEND_NONE指事件發(fā)生時,目標程序當前運行線程均不掛起;當線程被掛起時,系統(tǒng)可以獲得掛起線程的信息;當信息獲取完畢,系統(tǒng)恢復(fù)掛起線程,目標程序繼續(xù)執(zhí)行。6.根據(jù)權(quán)利要求I所述的擴展調(diào)試中的軌跡分析,其特征在于,程序在執(zhí)行過程中不停的產(chǎn)生事件,系統(tǒng)對其中部分事件進行分析處理,以求獲得完整的軌跡信息;當生成的事件為ThreadStartEvent時,系統(tǒng)設(shè)置該目標程序單步執(zhí)行setStepRequest;當生成的事件為MethodEntryEvent時,表示程序進入一個方法;此時,獲得被進入的方法的信息MethodInfo,生成MethodEntryTraceNode,添加到Trace中;當生成的事件為MethodExitEvent時,表示程序離開一個方法;此時,獲得離開的方法的信息MethodInfo,生成MethodExitTraceNode,添加到Trace中;當生成的事件為StepEvent時,獲取當前準備執(zhí)行語句的節(jié)點信息NodeInfo,包括類名、方法名及行號,生成NormalTraceNode,添加到Trace中;同時,根據(jù)切片準則,判斷是否到達切片處,如果沒有到達,繼續(xù)進行事件處理;否則,結(jié)束TraceAnalysis,獲得軌跡信息;當生成事件為VMDisconnectEvent時,表示系統(tǒng)與TargetVM斷開連接,系統(tǒng)進行結(jié)束處理;事件生成時,系統(tǒng)設(shè)置目標虛擬機掛起產(chǎn)生事件的線程;當完成對應(yīng)事件的處理后,線程恢復(fù)繼續(xù)執(zhí)行。7.根據(jù)權(quán)利要求I所述的擴展調(diào)試中的應(yīng)用類類層次分析HierarchyAnalysis,其特征在于,首先初始化HierarchyGraph,為HierarchyGraph添加節(jié)點,每個節(jié)點為appClass;遍歷HierarchyGraph,對每一個節(jié)點appClass,在appClasses中查找它的父類superclass和接口集合interfaces,并在HierarchyGraph中添加從appClass到superclass和interfaces的繼承邊;遍歷HierarchyGraph完成,HierarchyGraph建立完成。8.根據(jù)權(quán)利要求I所述的擴展調(diào)試中的控制依賴分析ControlDependenceAnalysis,其特征在于,取出appMethods中的每一個方法appMethod,分析生成方法的控制流圖ControlFlowGraph,以下簡稱CFG;對CFG取逆,得到appMethod的逆控制流圖inverseCFG;通過對inverseCFG進行支配關(guān)系分析,得到appMethod的后必經(jīng)樹Post-DominatedTree,以下簡稱I3DT;由后必經(jīng)樹TOT生成控制依賴CD;首先獲取控制流圖CFG中符合特定條件的邊的集合Collection(A,B),特定條件為PDT中B不是A的祖先;然后取出每一條特定邊(A,B),計算A和B的共同祖先L;如果L是A,則查找所有PDT中從A到B路徑上的點,記錄Nodes到A的控制依賴關(guān)系;否則,查找所有TOT中從L到B路徑上的點,記錄Nodes到A的控制依賴關(guān)系;所有的邊處理完成后,方法的控制依賴求解完畢。9.根據(jù)權(quán)利要求I所述的擴展調(diào)試中的程序切片Slice,其特征在于,系統(tǒng)獲取TargetVM當前發(fā)生的一條事件event,判斷事件類型,如果事件類型是MethodEntryEvent,表示程序進入一個方法method,生成軌跡節(jié)點MethodEntryTraceNode,將其添加到軌跡Trace中,獲取方法的堆棧信息frames,計算進入方法的控制依賴信息CD,生成方法的調(diào)用點信息calINode;程序計算完成方法的CD后,將該方法及對應(yīng)的CD保存起來;當程序在該次執(zhí)行過程中又一次進入該方法時,可以將查看之前的控制依賴記錄,直接找到該方法的⑶,不需要重復(fù)計算。10.根據(jù)權(quán)利要求9所述的生成調(diào)用點信息callNode,其特征在于,系統(tǒng)首先獲得產(chǎn)生MethodEntryEvent的線程引用threadReference,并從中得到該線程的調(diào)用堆棧信息;根據(jù)堆棧信息后向遍歷軌跡Trace,獲取調(diào)用軌跡節(jié)點callTraceNode;對調(diào)用軌跡節(jié)點對應(yīng)源碼進行靜態(tài)分析,包括參數(shù)分析及返回值分析,將得到的結(jié)果與callTraceNode結(jié)合生成方法的調(diào)用點信息callNode。全文摘要本發(fā)明涉及一種具有程序分析功能的程序調(diào)試系統(tǒng),該程序調(diào)試系統(tǒng)的調(diào)試步驟包括與目標虛擬機建立連接、標準調(diào)試及擴展調(diào)試;該程序調(diào)試系統(tǒng)不再局限于傳統(tǒng)的程序調(diào)試方式,使調(diào)試不再僅僅只是分析程序當前的運行狀態(tài),調(diào)試人員可以查看程序完整的執(zhí)行過程,方便的調(diào)試和理解程序;該程序調(diào)試系統(tǒng)還可以記錄程序一次執(zhí)行中的應(yīng)用類和應(yīng)用方法,可以降低調(diào)試人員的關(guān)注范圍;本系統(tǒng)進行動態(tài)程序切片時不需對程序進行回溯,且只對程序執(zhí)行過程中涉及的方法進行控制依賴分析,能夠提高算法的效率,根據(jù)堆棧信息和控制依賴關(guān)系能夠提高切片的精度。文檔編號G06F11/36GK102968372SQ20121049595公開日2013年3月13日申請日期2012年11月29日優(yōu)先權(quán)日2012年11月29日發(fā)明者王興亞,劉穎祺,郭超群,韓眾和,張艷梅,姜淑娟申請人:中國礦業(yè)大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1