CN102968372B - 具有程序分析功能的程序调试系统 - Google Patents
具有程序分析功能的程序调试系统 Download PDFInfo
- Publication number
- CN102968372B CN102968372B CN201210495957.9A CN201210495957A CN102968372B CN 102968372 B CN102968372 B CN 102968372B CN 201210495957 A CN201210495957 A CN 201210495957A CN 102968372 B CN102968372 B CN 102968372B
- Authority
- CN
- China
- Prior art keywords
- program
- debugging
- event
- targetvm
- information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
<b>本发明涉及</b><b>一种</b><b>具有程序分析功能的程序调试系统,该程序调试系统的调试步骤包括与目标虚拟机建立连接、标准调试及扩展调试;</b><b>该程序调试系统不再局限于传统的程序调试方式,使调试不再仅仅只是分析程序当前的运行状态,调试人员可以查看程序完整的执行过程,方便的调试和理解程序;该程序调试系统还可以记录程序一次执行中的应用类和应用方法,可以降低调试人员的关注范围;本系统进行动态程序切片时不需对程序进行回溯,且只对程序执行过程中涉及的方法进行控制依赖分析,能够提高算法的效率,根据堆栈信息和控制依赖关系能够提高切片的精度。</b>
Description
技术领域
本发明涉及一种程序调试系统,尤其是在软件调试和系统维护过程中对程序进行分析和理解的具有程序分析功能的程序调试系统。
背景技术
程序调试,是将编制的程序投入实际运行前,用手工或编译程序的方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。随着软件规模的日益增大,传统的调试技术不能够有效地处理复杂大型程序。大型应用系统通常有数百万行的代码,程序开发人员往往不能够快速的理解程序中代码,这给程序的调试和维护工作带来了很大的困难。
在程序调试中,最常见的工作是发现一个错误并找出所有与该错误有关的语句,动态程序切片工具可容易地做到这一点。程序切片是一种程序分析技术,用来将大程序分解成小片段,删除一些与兴趣点不相关的语句,帮助开发人员从中提取感兴趣的部分。其概念和原理由M.Weiser于1979首次建立。使用程序切片技术,将简化程序分析和理解的难度,加速程序的测试和调试工作,缩短程序的开发和维护时间。
根据切片过程对程序某一次具体的输入的依赖程度,可以将程序切片分为静态切片和动态切片。静态切片是指不考虑程序运行时的输入,完全利用静态分析方法得到切片,即通过分析程序的源代码,计算所有可能输入情况下的程序切片。静态切片考虑了程序中所有的执行路径,包含了所有与兴趣点处变量相关的语句,而不管某些语句在程序实际的执行中是否被执行,具有很大的冗余性。动态切片是指在特定输入下实际影响兴趣点变量值或受兴趣点变量值影响的所有语句的集合。动态切片只考虑程序在某个具体输入下,实际执行的路径中,和兴趣点变量相关的语句。因此,动态切片的计算过程依赖于程序的具体输入,每一次的计算工作量较小,得到的切片相对比较精确。
发明内容
为了解决现有的调试技术不能够有效地处理复杂大型程序且程序开发人员往往不能够快速的理解程序中代码的问题,本发明提供一种具有程序分析功能的程序调试系统,该程序调试系统不再局限于传统的程序调试方式,使调试不再仅仅只是分析程序当前的运行状态,该程序调试系统可以记录从程序开始执行到当前状态的轨迹信息,调试人员可以查看程序完整的执行过程,方便的调试和理解程序;该程序调试系统还可以记录程序一次执行中的应用类和应用方法,可以降低调试人员的关注范围;本发明计算应用方法的控制依赖信息,从而可以求得调试语句的动态程序切片,可以使调试人员得到更加精确的调试信息,同时本系统进行动态程序切片时不需对程序进行回溯,且只对程序执行过程中涉及的方法进行控制依赖分析,能够提高算法的效率,根据堆栈信息和控制依赖关系能够提高切片的精度。
本发明解决其技术问题所采用的技术方案是:该程序调试系统针对Java语言,在eclipse环境中开发,具有标准的调试功能和扩展的调试功能。标准的调试功能包括分步执行、设置断点、检查变量和值及挂起和恢复线程四项功能。扩展的调试功能包括轨迹分析、应用类类层次分析、控制依赖分析及动态程序切片四项功能。
该程序调试系统的调试步骤如下:
(1)与目标虚拟机建立连接。Java程序运行在虚拟机VirtualMachine中,程序调试系统要对目标程序Target进行调试,首先要与目标虚拟机TargetVM建立连接,获得目标虚拟机镜像TargetVMMirror。
实现了VirtualMachine接口,该接口提供了一套方法,可以用来直接或间接地获取目标虚拟机TargetVM上所有的状态信息,也可以挂起、恢复、中止TargetVM,系统因此可以获取TargetVM上的信息,维持与目标虚拟机的通信,检查、修改和控制TargetVM上的资源。
连接的流程图如图1所示。启动系统,获得目标虚拟机连接器Connector,Connector有共享内存连接器ShareMemoryConnector和套接字连接器SocketConnector两种。不同的Java开发工具包JDK含有其中的一种或两种。选择一种Connector,其中ShareMemoryConnector优先,设置共享地址后进入监听状态,等待目标虚拟机TargetVM执行。
监听到TargetVM启动后,立刻与TargetVM连接,获得TargetVMMirror;此时,JavaDebugger就可以通过TargetVMMirror对TargetVM进行操纵;为了获得程序的轨迹信息,需要对目标虚拟机进行事件请求EventRequest设置,包括ThreadStartRequest、ClassPrepareRequest、MethodEntryRequest及MethodExitRequest,完成事件请求配置后,系统控制目标程序开始执行,并对程序执行产生的事件进行处理。
(2)标准调试StandardDebugging。与目标虚拟机TargetVM进行连接后,系统可以对目标程序Target进行标准调试。标准调试包括分步执行Step-by-step、设置断点SetBreakpoints、检查变量和值InspectVariables和挂起/恢复线程Suspend/resumethreads。
四项标准调试方法分别如下:
2.1分步执行Step-by-step。分步执行是最常见的调试手段之一,即每次只执行一行代码。采用这种方式,程序调试人员可以一步一步跟踪程序执行的流程,根据变量的值,找到错误的原因。
系统设置Target分步执行Step-by-step的流程图如图2所示。系统获取TargetVM当前发生的一条事件event,判断事件类型。如果事件类型是ThreadStartEvent,获取事件发生所在线程的引用threadReference,根据过滤信息Filter为引用添加类过滤器addClassExclusionFilter,然后设置线程单步执行setStepRequest。此时,发生事件所在线程开始单步执行。当所有的线程都设置为分步执行时,Target单步执行。如果事件类型不是ThreadStartEvent,根据类型调用相应事件的处理方法。
设置断点SetBreakpoints。设置断点是调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析。也可以在一次调试中设置断点,下一次程序运行到断点位置,便可在上次设置断点的位置中断下来,极大的方便了操作,同时节省了时间。
系统设置断点SetBreakpoints的流程图如图3所示。系统获取TargetVM当前发生的一条事件event,判断事件类型。如果事件类型是ClassPrepareEvent,获取事件产生事件镜像的引用referenceType。从断点设置信息集合BpSetMsgs中取出每一条断点设置信息BpSetMsg,查看该信息是否与引用相匹配。如果匹配,则根据该信息设置断点,否则,获取下一条BpSetMsg,直至每一条信息都取出匹配过。如果事件类型为LocatableEvent,则可以获取断点事件请求集合breakpointRequests,根据程序调试人员的需要添加新的断点或删除已有断点。如果事件类型不是上述两种类型,根据类型调用相应事件的处理方法。
检查变量和值InspectVariables。检查变量和值是调试器的基本功能之一,是直接有效的了解程序当前运行状态的方式。通过检查程序在当前运行状态下某个变量是否存在以及可见变量的值,程序调试人员可以判断程序是否按照合理的方式运行。
系统检查变量和值InspectVariables的流程图如图4所示。系统获取TargetVM当前发生的一条事件event,判断事件类型。如果事件类型是LocatableEvent,则获取程序当前运行的位置信息Location,从而获取当前运行类的镜像referenceType,进而可获得程序的变量集合fields。fields中保存了当前可见的变量的值。如果事件类型不是上述两种类型,根据类型调用相应事件的处理方法。
挂起/恢复线程Suspend/resumethreads。挂起线程是指线程暂时让出CPU的使用权限,暂时停止执行;恢复线程是指让已挂起的线程恢复执行,即从中断停止处继续线程的执行。线程挂起时,调试器可以获得当前程序运行信息并显示出来供程序调试人员参考。
系统在进行事件请求设置setEventRequest时,可以设置是否在事件发生后挂起目标虚拟机Target。挂起方式分为三种,分别是SUSPEND_ALL、SUSPEND_EVENT_THREAD以及SUSPEND_NONE。SUSPEND_ALL指事件发生时,挂起目标程序当前运行的所有线程;SUSPEND_EVENT_THREAD指事件发生时,挂起目标程序当前运行线程中产生该事件的线程;SUSPEND_NONE指事件发生时,目标程序当前运行线程均不挂起。当线程被挂起时,系统可以获得挂起线程的信息。当信息获取完毕,系统恢复挂起线程,目标程序继续执行。
(3)扩展调试ExtendedDebugging。与目标虚拟机TargetVM进行连接后,系统可以结合标准调试StandardDebugging,实现对目标程序Target的扩展调试功能。扩展调试包括轨迹分析TraceAnalysis、应用类类层次分析HierarchyAnalysis、控制依赖分析ControlDependenceAnalysis及动态程序切片DynamicSlice。
四项扩展调试方法分别如下:
3.1轨迹分析TraceAnalysis。系统获得程序在一次输入下的轨迹信息,包括轨迹Trace以及应用类集和应用方法集appClassesandappMethods。
轨迹Trace是一个键值对集合Collection<Seq,TraceNode>,记录程序的执行过程。Seq是执行序号,表示TraceNode产生的顺序。TraceNode是轨迹节点,记录程序每一步的执行情况。依据执行情况的不同,TraceNode的类型分为三种,分别是NormalTraceNode、MethodEntryTraceNode和MethodExitTraceNode。每一个Seq对应一个TraceNode。
应用类集和应用方法集appClassesandappMethods是程序在执行过程中实际使用的类和方法。应用类集appClasses包括的信息为程序执行时使用的类的类名,应用方法集appMethods包括的信息为程序执行时使用的方法的详细信息MethodInfo,如方法名、方法参数信息及方法返回值信息。
轨迹分析的流程图如图5所示,程序在执行过程中不停的产生事件,系统对其中部分事件进行分析处理,以求获得完整的轨迹信息。当生成的事件为ThreadStartEvent时,系统设置该目标程序单步执行setStepRequest。当生成的事件为MethodEntryEvent时,表示程序进入一个方法。此时,获得被进入的方法的信息MethodInfo,生成MethodEntryTraceNode,添加到轨迹Trace中。当生成的事件为MethodExitEvent时,表示程序离开一个方法。此时,获得离开的方法的信息MethodInfo,生成MethodExitTraceNode,添加到轨迹Trace中。当生成的事件为StepEvent时,获取当前准备执行语句的节点信息NodeInfo,包括类名、方法名及行号,生成NormalTraceNode,添加到轨迹Trace中。同时,根据切片准则,判断是否到达切片处,如果没有到达,继续进行事件处理。否则,结束TraceAnalysis,获得轨迹信息。当生成事件为VMDisconnectEvent时,表示系统与TargetVM断开连接,系统进行结束处理。事件生成时,系统设置目标虚拟机挂起产生事件的线程。当完成对应事件的处理后,线程恢复继续执行。
应用类类层次分析HierarchyAnalysis。完成轨迹分析后,得到程序在一次输入下的应用类集appClasses。该模块建立appClasses的类层次图HierarchyGraph。
准确的说,类层次图HierarchyGraph是森林,记录了appClasses之间的继承关系。森林中的每一棵树是具有同一父类的类的集合,其中根节点是树中所有节点的父类,父节点是子节点的父类,子节点是父节点的派生类。HierarchyGraph中的节点是类名,边表示类的继承关系。
应用类类层次分析HierarchyAnalysis的流程如图6所示。首先初始化HierarchyGraph,为HierarchyGraph添加节点,每个节点为appClass。遍历HierarchyGraph,对每一个节点appClass,在appClasses中查找它的父类superClass和接口集合interfaces,并在HierarchyGraph中添加从appClass到superClass和interfaces的继承边。遍历HierarchyGraph完成,HierarchyGraph建立完成。
控制依赖分析ControlDependenceAnalysis。该模块计算程序运行时遇到的每一个应用方法appMethod的控制依赖ControlDependence,以下简称CD。
控制依赖用于表示由于控制流引起的程序实体之间的关系,它的定义如下:令G是一个控制流图,n1和n2是G中的节点,若下列三个条件满足,则n2控制依赖n1,记为CD(n2,n1)。
1)从n2到n1之间存在一条可执行路径P;
2)对P上除n1,n2外的每个节点n,节点n2都是它的后必经节点;
3)节点n2不是节点n1的后必经节点。
控制依赖分析ControlDependenceAnalysis的流程如图7所示。取出appMethods中的每一个方法appMethod,分析生成方法的控制流图ControlFlowGraph,以下简称CFG。对CFG取逆,得到appMethod的逆控制流图inverseCFG。通过对inverseCFG进行支配关系分析,得到appMethod的后必经树Post-DominatedTree,以下简称PDT。
由后必经树PDT生成控制依赖CD的流程图如图8所示。首先获取控制流图CFG中符合特定条件的边的集合Collection(A,B),特定条件为PDT中B不是A的祖先。然后取出每一条特定边(A,B),计算A和B的共同祖先L。如果L是A,则查找所有PDT中从A到B路径上的点(Nodes,包括A但不包括B),记录Nodes到A的控制依赖关系。否则,查找所有PDT中从L到B路径上的点(Nodes,包括B但不包括L),记录Nodes到A的控制依赖关系。所有的边处理完成后,方法的控制依赖求解完毕。
动态程序切片DynamicSlice。该模块计算程序运行过程中每一条语句、每一个变量的动态程序切片。当程序执行到某一条语句时,通过轨迹分析TraceAnalysis,系统获得了程序的轨迹信息;通过控制依赖分析,系统获得了应用方法集appMethods中各个方法的控制依赖信息;该模块在前面各个模块分析的基础上完成动态程序切片功能;该模块是系统的核心模块。
动态程序切片DynamicSlice的流程如图9所示。系统获取TargetVM当前发生的一条事件event,判断事件类型。如果事件类型是MethodEntryEvent,表示程序进入一个方法method。生成轨迹节点MethodEntryTraceNode,将其添加到轨迹Trace中。获取方法的堆栈信息frames,计算进入方法的控制依赖信息CD,生成方法的调用点信息callNode。
程序计算完成方法的CD后,将该方法及对应的CD保存起来。当程序在该次执行过程中又一次进入该方法时,可以查看之前的控制依赖记录,直接找到该方法的CD,不需要重复计算。
生成方法的调用点信息callNode的流程图如图10所示。系统首先获得产生MethodEntryEvent的线程引用threadReference,并从中得到该线程的调用堆栈信息。根据堆栈信息后向遍历轨迹Trace,获取调用轨迹节点callTraceNode。对调用轨迹节点对应源码进行静态分析,包括参数分析及返回值分析,将得到的结果与callTraceNode结合生成方法的调用点信息callNode。
建立并初始化LiveMethodInfo,用于维护和支持对该方法内的语句和变量进行切片。在LiveMethodInfo中,生成SliceOfThis2和SliceOfParams2。其中SliceOfThis2记录了调用对象本身切片与形式化的对象切片,SliceOfParams2记录了程序参数中为引用类型的实参切片和形参切片。之后,生成变量切片集合SliceOfVars和节点切片集合SliceOfNodes,SliceOfVars记录了method中除静态变量StaticVar外所有变量的切片,SliceOfNodes记录了method中所有语句的切片。完成后,将LiveMethodInfo添加到栈lmis中。
如果事件类型是StepEvent,表示程序执行一条语句node。生成轨迹节点NormalTraceNode,并将其添加到轨迹Trace中。生成并初始化节点切片nodeSlice。判断该语句是否有控制依赖节点,如果有,查找当前控制依赖节点的切片SliceOfCD,添加到nodeSlice,更新nodeSlice的调用&控制切片sliceOfPreds。如果没有,添加SliceOfCallPreds到nodeSlice,更新nodeSlice的调用&控制切片sliceOfPreds。
由于语句本身包含的信息量较大且复杂,对语句本身进行分析的困难度比较高。为了降低语句分析的难度同时保证语句分析的正确性,需要将一条语句转换成多条三地址码,对三地址码进行分析和切片操作。系统利用Soot将语句转换成具有三地址代码格式的Jimple代码,一条Java语句被转换成多条Jimple语句,系统对一条Java语句node的操作处转换为对多条Jimple语句units的处理。
取出每一条Jimple语句unit,判断它是否为返回语句RetUnit。如果unit是RetUnit,进行返回值切片SliceOfRet处理。否则,对语句进行变量分析,得到使用变量集合useVars和定义变量集合defVars。对于useVars中的每一个变量useVar,添加它的切片varSlice到nodeSlice中。对于defVars中的每一个变量defVar,添加nodeSlice到它的切片varSlice中。所有的Jimple语句完成后,一个node的切片完成。此时,将nodeSlice添加到SliceOfNodes中,完成一条语句的切片。
如果事件类型是MethodExitEvent,表示程序退出一个方法method。生成轨迹节点MethodExitTraceNode,并将其添加到轨迹Trace中。之后,完成LiveMethodInfo的整理工作,包括更新this的切片结果、更新引用实参的切片结果;最后,栈lmis执行出栈操作。
本发明的有益效果是,该程序调试系统不再局限于传统的程序调试方式,使调试不再仅仅只是分析程序当前的运行状态,该程序调试系统可以记录从程序开始执行到当前状态的轨迹信息,调试人员可以查看程序完整的执行过程,方便的调试和理解程序;该程序调试系统还可以记录程序一次执行中的应用类和应用方法,可以降低调试人员的关注范围;本发明计算应用方法的控制依赖信息,从而可以求得调试语句的动态程序切片,可以使调试人员得到更加精确的调试信息,同时本系统进行动态程序切片时不需对程序进行回溯,且只对程序执行过程中涉及的方法进行控制依赖分析,能够提高算法的效率,根据堆栈信息和控制依赖关系能够提高切片的精度。
附图说明
下面结合附图和实施例对本发明作进一步说明。
图1是连接的流程示意图。
图2是分步执行的流程示意图。
图3设置断点的流程图。
图4检查变量和值的流程图。
图5轨迹分析的流程图。
图6应用类类层次分析流程图。
图7控制依赖分析流程图。
图8后必经树生成控制依赖流程图。
图9程序切片流程图。
图10生成调用点信息流程图。
具体实施方式
该程序调试系统针对Java语言,在eclipse环境中开发,具有标准的调试功能和扩展的调试功能。标准的调试功能包括分步执行、设置断点、检查变量和值及挂起和恢复线程四项功能。扩展的调试功能包括轨迹分析、应用类类层次分析、控制依赖分析及动态程序切片四项功能。
该程序调试系统的调试步骤如下:
(1)与目标虚拟机建立连接。Java程序运行在虚拟机VirtualMachine中,程序调试系统要对目标程序Target进行调试,首先要与目标虚拟机TargetVM建立连接,获得目标虚拟机镜像TargetVMMirror。
实现了VirtualMachine接口,该接口提供了一套方法,可以用来直接或间接地获取目标虚拟机TargetVM上所有的状态信息,也可以挂起、恢复、中止TargetVM,系统因此可以获取TargetVM上的信息,维持与目标虚拟机的通信,检查、修改和控制TargetVM上的资源。
连接的流程图如图1所示。启动系统,获得目标虚拟机连接器Connector,Connector有共享内存连接器ShareMemoryConnector和套接字连接器SocketConnector两种。不同的Java开发工具包JDK含有其中的一种或两种。选择一种Connector,其中ShareMemoryConnector优先,设置共享地址后进入监听状态,等待目标虚拟机TargetVM执行。
监听到TargetVM启动后,立刻与TargetVM连接,获得TargetVMMirror;此时,JavaDebugger就可以通过TargetVMMirror对TargetVM进行操纵;为了获得程序的轨迹信息,需要对目标虚拟机进行事件请求EventRequest设置,包括ThreadStartRequest、ClassPrepareRequest、MethodEntryRequest及MethodExitRequest,完成事件请求配置后,系统控制目标程序开始执行,并对程序执行产生的事件进行处理。
(2)标准调试StandardDebugging。与目标虚拟机TargetVM进行连接后,系统可以对目标程序Target进行标准调试。标准调试包括分步执行Step-by-step、设置断点SetBreakpoints、检查变量和值InspectVariables和挂起/恢复线程Suspend/resumethreads。
四项标准调试方法分别如下:
2.1分步执行Step-by-step。分步执行是最常见的调试手段之一,即每次只执行一行代码。采用这种方式,程序调试人员可以一步一步跟踪程序执行的流程,根据变量的值,找到错误的原因。
系统设置Target分步执行Step-by-step的流程图如图2所示。系统获取TargetVM当前发生的一条事件event,判断事件类型。如果事件类型是ThreadStartEvent,获取事件发生所在线程的引用threadReference,根据过滤信息Filter为引用添加类过滤器addClassExclusionFilter,然后设置线程单步执行setStepRequest。此时,发生事件所在线程开始单步执行。当所有的线程都设置为分步执行时,Target单步执行。如果事件类型不是ThreadStartEvent,根据类型调用相应事件的处理方法。
设置断点SetBreakpoints。设置断点是调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析。也可以在一次调试中设置断点,下一次程序运行到断点位置,便可在上次设置断点的位置中断下来,极大的方便了操作,同时节省了时间。
系统设置断点SetBreakpoints的流程图如图3所示。系统获取TargetVM当前发生的一条事件event,判断事件类型。如果事件类型是ClassPrepareEvent,获取事件产生事件镜像的引用referenceType。从断点设置信息集合BpSetMsgs中取出每一条断点设置信息BpSetMsg,查看该信息是否与引用相匹配。如果匹配,则根据该信息设置断点,否则,获取下一条BpSetMsg,直至每一条信息都取出匹配过。如果事件类型为LocatableEvent,则可以获取断点事件请求集合breakpointRequests,根据程序调试人员的需要添加新的断点或删除已有断点。如果事件类型不是上述两种类型,根据类型调用相应事件的处理方法。
检查变量和值InspectVariables。检查变量和值是调试器的基本功能之一,是直接有效的了解程序当前运行状态的方式。通过检查程序在当前运行状态下某个变量是否存在以及可见变量的值,程序调试人员可以判断程序是否按照合理的方式运行。
系统检查变量和值InspectVariables的流程图如图4所示。系统获取TargetVM当前发生的一条事件event,判断事件类型。如果事件类型是LocatableEvent,则获取程序当前运行的位置信息Location,从而获取当前运行类的镜像referenceType,进而可获得程序的变量集合fields。fields中保存了当前可见的变量的值。如果事件类型不是上述两种类型,根据类型调用相应事件的处理方法。
挂起/恢复线程Suspend/resumethreads。挂起线程是指线程暂时让出CPU的使用权限,暂时停止执行;恢复线程是指让已挂起的线程恢复执行,即从中断停止处继续线程的执行。线程挂起时,调试器可以获得当前程序运行信息并显示出来供程序调试人员参考。
系统在进行事件请求设置setEventRequest时,可以设置是否在事件发生后挂起目标虚拟机Target。挂起方式分为三种,分别是SUSPEND_ALL、SUSPEND_EVENT_THREAD以及SUSPEND_NONE。SUSPEND_ALL指事件发生时,挂起目标程序当前运行的所有线程;SUSPEND_EVENT_THREAD指事件发生时,挂起目标程序当前运行线程中产生该事件的线程;SUSPEND_NONE指事件发生时,目标程序当前运行线程均不挂起。当线程被挂起时,系统可以获得挂起线程的信息。当信息获取完毕,系统恢复挂起线程,目标程序继续执行。
(3)扩展调试ExtendedDebugging。与目标虚拟机TargetVM进行连接后,系统可以结合标准调试StandardDebugging,实现对目标程序Target的扩展调试功能。扩展调试包括轨迹分析TraceAnalysis、应用类类层次分析HierarchyAnalysis、控制依赖分析ControlDependenceAnalysis及动态程序切片DynamicSlice。
三项扩展调试方法分别如下:
3.1轨迹分析TraceAnalysis。系统获得程序在一次输入下的轨迹信息,包括轨迹Trace以及应用类集和应用方法集appClassesandappMethods。
轨迹Trace是一个键值对集合Collection<Seq,TraceNode>,记录程序的执行过程。Seq是执行序号,表示TraceNode产生的顺序。TraceNode是轨迹节点,记录程序每一步的执行情况。依据执行情况的不同,TraceNode的类型分为三种,分别是NormalTraceNode、MethodEntryTraceNode和MethodExitTraceNode。每一个Seq对应一个TraceNode。
应用类集和应用方法集appClassesandappMethods是程序在执行过程中实际使用的类和方法。应用类集appClasses包括的信息为程序执行时使用的类的类名,应用方法集appMethods包括的信息为程序执行时使用的方法的详细信息MethodInfo,如方法名、方法参数信息及方法返回值信息。
轨迹分析的流程图如图5所示,程序在执行过程中不停的产生事件,系统对其中部分事件进行分析处理,以求获得完整的轨迹信息。当生成的事件为ThreadStartEvent时,系统设置该目标程序单步执行setStepRequest。当生成的事件为MethodEntryEvent时,表示程序进入一个方法。此时,获得被进入的方法的信息MethodInfo,生成MethodEntryTraceNode,添加到轨迹Trace中。当生成的事件为MethodExitEvent时,表示程序离开一个方法。此时,获得离开的方法的信息MethodInfo,生成MethodExitTraceNode,添加到轨迹Trace中。当生成的事件为StepEvent时,获取当前准备执行语句的节点信息NodeInfo,包括类名、方法名及行号,生成NormalTraceNode,添加到轨迹Trace中。同时,根据切片准则,判断是否到达切片处,如果没有到达,继续进行事件处理。否则,结束TraceAnalysis,获得轨迹信息。当生成事件为VMDisconnectEvent时,表示系统与TargetVM断开连接,系统进行结束处理。事件生成时,系统设置目标虚拟机挂起产生事件的线程。当完成对应事件的处理后,线程恢复继续执行。
应用类类层次分析HierarchyAnalysis。完成轨迹分析后,得到程序在一次输入下的应用类集appClasses。该模块建立appClasses的类层次图HierarchyGraph。
准确的说,类层次图HierarchyGraph是森林,记录了appClasses之间的继承关系。森林中的每一棵树是具有同一父类的类的集合,其中根节点是树中所有节点的父类,父节点是子节点的父类,子节点是父节点的派生类。HierarchyGraph中的节点是类名,边表示类的继承关系。
应用类类层次分析HierarchyAnalysis的流程如图6所示。首先初始化HierarchyGraph,为HierarchyGraph添加节点,每个节点为appClass。遍历HierarchyGraph,对每一个节点appClass,在appClasses中查找它的父类superClass和接口集合interfaces,并在HierarchyGraph中添加从appClass到superClass和interfaces的继承边。遍历HierarchyGraph完成,HierarchyGraph建立完成。
控制依赖分析ControlDependenceAnalysis。该模块计算程序运行时遇到的每一个应用方法appMethod的控制依赖ControlDependence,以下简称CD。
控制依赖用于表示由于控制流引起的程序实体之间的关系,它的定义如下:令G是一个控制流图,n1和n2是G中的节点,若下列三个条件满足,则n2控制依赖n1,记为CD(n2,n1)。
)t’s从n2到n1之间存在一条可执行路径P;
5)对P上除n1,n2外的每个节点n,节点n2都是它的后必经节点;
6)节点n2不是节点n1的后必经节点。
控制依赖分析ControlDependenceAnalysis的流程如图7所示。取出appMethods中的每一个方法appMethod,分析生成方法的控制流图ControlFlowGraph,以下简称CFG。对CFG取逆,得到appMethod的逆控制流图inverseCFG。通过对inverseCFG进行支配关系分析,得到appMethod的后必经树Post-DominatedTree,以下简称PDT。
由后必经树PDT生成控制依赖CD的流程图如图8所示。首先获取控制流图CFG中符合特定条件的边的集合Collection(A,B),特定条件为PDT中B不是A的祖先。然后取出每一条特定边(A,B),计算A和B的共同祖先L。如果L是A,则查找所有PDT中从A到B路径上的点(Nodes,包括A但不包括B),记录Nodes到A的控制依赖关系。否则,查找所有PDT中从L到B路径上的点(Nodes,包括B但不包括L),记录Nodes到A的控制依赖关系。所有的边处理完成后,方法的控制依赖求解完毕。
动态程序切片DynamicSlice。该模块计算程序运行过程中每一条语句、每一个变量的动态程序切片。当程序执行到某一条语句时,通过轨迹分析TraceAnalysis,系统获得了程序的轨迹信息;通过控制依赖分析,系统获得了应用方法集appMethods中各个方法的控制依赖信息;该模块在前面各个模块分析的基础上完成动态程序切片功能;该模块是系统的核心模块。
动态程序切片DynamicSlice的流程如图9所示。系统获取TargetVM当前发生的一条事件event,判断事件类型。如果事件类型是MethodEntryEvent,表示程序进入一个方法method。生成轨迹节点MethodEntryTraceNode,将其添加到轨迹Trace中。获取方法的堆栈信息frames,计算进入方法的控制依赖信息CD,生成方法的调用点信息callNode。
程序计算完成方法的CD后,将该方法及对应的CD保存起来。当程序在该次执行过程中又一次进入该方法时,可以查看之前的控制依赖记录,直接找到该方法的CD,不需要重复计算。
生成方法的调用点信息callNode的流程图如图10所示。系统首先获得产生MethodEntryEvent的线程引用threadReference,并从中得到该线程的调用堆栈信息。根据堆栈信息后向遍历轨迹Trace,获取调用轨迹节点callTraceNode。对调用轨迹节点对应源码进行静态分析,包括参数分析及返回值分析,将得到的结果与callTraceNode结合生成方法的调用点信息callNode。
建立并初始化LiveMethodInfo,用于维护和支持对该方法内的语句和变量进行切片。在LiveMethodInfo中,生成SliceOfThis2和SliceOfParams2。其中SliceOfThis2记录了调用对象本身切片与形式化的对象切片,SliceOfParams2记录了程序参数中为引用类型的实参切片和形参切片。之后,生成变量切片集合SliceOfVars和节点切片集合SliceOfNodes,SliceOfVars记录了method中除静态变量StaticVar外所有变量的切片,SliceOfNodes记录了method中所有语句的切片。完成后,将LiveMethodInfo添加到栈lmis中。
如果事件类型是StepEvent,表示程序执行一条语句node。生成轨迹节点NormalTraceNode,并将其添加到轨迹Trace中。生成并初始化节点切片nodeSlice。判断该语句是否有控制依赖节点,如果有,查找当前控制依赖节点的切片SliceOfCD,添加到nodeSlice,更新nodeSlice的调用&控制切片sliceOfPreds。如果没有,添加SliceOfCallPreds到nodeSlice,更新nodeSlice的调用&控制切片sliceOfPreds。
由于语句本身包含的信息量较大且复杂,对语句本身进行分析的困难度比较高。为了降低语句分析的难度同时保证语句分析的正确性,需要将一条语句转换成多条三地址码,对三地址码进行分析和切片操作。系统利用Soot将语句转换成具有三地址代码格式的Jimple代码,一条Java语句被转换成多条Jimple语句,系统对一条Java语句node的操作处转换为对多条Jimple语句units的处理。
取出每一条Jimple语句unit,判断它是否为返回语句RetUnit。如果unit是RetUnit,进行返回值切片SliceOfRet处理。否则,对语句进行变量分析,得到使用变量集合useVars和定义变量集合defVars。对于useVars中的每一个变量useVar,添加它的切片varSlice到nodeSlice中。对于defVars中的每一个变量defVar,添加nodeSlice到它的切片varSlice中。所有的Jimple语句完成后,一个node的切片完成。此时,将nodeSlice添加到SliceOfNodes中,完成一条语句的切片。
如果事件类型是MethodExitEvent,表示程序退出一个方法method。生成轨迹节点MethodExitTraceNode,并将其添加到轨迹Trace中。之后,完成LiveMethodInfo的整理工作,包括更新this的切片结果、更新引用实参的切片结果;最后,栈lmis执行出栈操作。
Claims (4)
1.具有程序分析功能的程序调试系统,该程序调试系统的调试步骤包括与目标虚拟机建立连接、标准调试及扩展调试,其特征在于,与目标虚拟机建立连接,Java程序运行在虚拟机VirtualMachine中,程序调试系统要对目标程序Target进行调试,首先要与目标虚拟机TargetVM建立连接,获得目标虚拟机镜像TargetVMMirror;TargetVMMirror实现了VirtualMachine接口,该接口提供了一套方法,可以用来直接或间接地获取目标虚拟机TargetVM上所有的状态信息,也可以挂起、恢复、中止TargetVM,系统因此可以获取TargetVM上的信息,维持与目标虚拟机的通信,检查、修改和控制TargetVM上的资源;启动系统,获得目标虚拟机连接器Connector,Connector有共享内存连接器ShareMemoryConnector和套接字连接器SocketConnector两种;选择一种Connector,设置共享地址后进入监听状态,等待目标虚拟机TargetVM执行;Connector监听到TargetVM启动后,立刻与TargetVM连接,获得TargetVMMirror;此时,JavaDebugger就可以通过TargetVMMirror对TargetVM进行操纵;为了获得程序的轨迹信息,需要对目标虚拟机进行事件请求EventRequest设置,包括ThreadStartRequest、ClassPrepareRequest、MethodEntryRequest及MethodExitRequest,完成事件请求设置后,系统控制目标程序开始执行,并对程序执行产生的事件进行处理;标准调试,与目标虚拟机TargetVM进行连接后,系统可以对目标程序Target进行标准调试;标准调试包括分步执行Step-by-step、设置断点SetBreakpoints、检查变量和值InspectVariables和挂起/恢复线程Suspend/resumethreads;扩展调试,与目标虚拟机TargetVM进行连接后,系统可以结合标准调试StandardDebugging,实现对目标程序Target的扩展调试功能;扩展调试包括轨迹分析TraceAnalysis、应用类类层次分析HierarchyAnalysis、控制依赖分析ControlDependenceAnalysis及动态程序切片DynamicSlice;当程序执行到某一条语句时,通过轨迹分析TraceAnalysis,系统获得了程序的轨迹信息,包括轨迹Trace以及应用类集和应用方法集appClassesandappMethods;通过应用类类层次分析HierarchyAnalysis,建立appClasses的类层次图HierarchyGraph;通过控制依赖分析ControlDependenceAnalysis,系统获得了应用方法集appMethods中各个方法的控制依赖信息;动态程序切片DynamicSlice在前面各个模块分析的基础上完成动态程序切片功能。
2.根据权利要求1所述的具有程序分析功能的程序调试系统,所述的扩展调试中的轨迹分析TraceAnalysis特征在于,程序在执行过程中不停的产生事件,系统对其中部分事件进行分析处理,以求获得完整的轨迹信息;当生成的事件为ThreadStartEvent时,系统设置该目标程序单步执行setStepRequest;当生成的事件为MethodEntryEvent时,表示程序进入一个方法;此时,获得被进入的方法的信息MethodInfo,生成MethodEntryTraceNode,添加到轨迹Trace中;当生成的事件为MethodExitEvent时,表示程序离开一个方法;此时,获得离开的方法的信息MethodInfo,生成MethodExitTraceNode,添加到轨迹Trace中;当生成的事件为StepEvent时,获取当前准备执行语句的节点信息NodeInfo,包括类名、方法名及行号,生成NormalTraceNode,添加到轨迹Trace中;同时,根据切片准则,判断是否到达切片处,如果没有到达,继续进行事件处理;否则,结束TraceAnalysis,获得轨迹信息;当生成事件为VMDisconnectEvent时,表示系统与TargetVM断开连接,系统进行结束处理;事件生成时,系统设置目标虚拟机挂起产生事件的线程;当完成对应事件的处理后,线程恢复继续执行。
3.根据权利要求1所述的具有程序分析功能的程序调试系统,所述的扩展调试中的动态程序切片DynamicSlice特征在于,系统获取TargetVM当前发生的一条事件event,判断事件类型,如果事件类型是MethodEntryEvent,表示程序进入一个方法method,生成轨迹节点MethodEntryTraceNode,将其添加到轨迹Trace中,获取方法的堆栈信息frames,计算进入方法的控制依赖信息CD,生成方法的调用点信息callNode;程序计算完成方法的CD后,将该方法及对应的CD保存起来;当程序在该次执行过程中又一次进入该方法时,可以查看之前的控制依赖记录,直接找到该方法的CD,不需要重复计算。
4.根据权利要求3所述的具有程序分析功能的程序调试系统,所述的生成方法的调用点信息callNode特征在于,系统首先获得产生MethodEntryEvent的线程引用threadReference,并从中得到该线程的调用堆栈信息;根据堆栈信息后向遍历轨迹Trace,获取调用轨迹节点callTraceNode;对调用轨迹节点对应源码进行静态分析,包括参数分析及返回值分析,将得到的结果与callTraceNode结合生成方法的调用点信息callNode。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210495957.9A CN102968372B (zh) | 2012-11-29 | 2012-11-29 | 具有程序分析功能的程序调试系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210495957.9A CN102968372B (zh) | 2012-11-29 | 2012-11-29 | 具有程序分析功能的程序调试系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102968372A CN102968372A (zh) | 2013-03-13 |
CN102968372B true CN102968372B (zh) | 2016-05-11 |
Family
ID=47798524
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210495957.9A Expired - Fee Related CN102968372B (zh) | 2012-11-29 | 2012-11-29 | 具有程序分析功能的程序调试系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102968372B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9195458B2 (en) * | 2013-07-31 | 2015-11-24 | International Business Machines Corporation | System and/or method for computing interprocedural dominators |
CN104461883B (zh) * | 2014-12-03 | 2017-11-14 | 中国矿业大学 | 基于程序执行轨迹的过程间动态程序切片系统 |
CN105068789B (zh) * | 2015-07-10 | 2018-08-24 | 武汉工程大学 | 一种对象使用场景提取方法及装置 |
CN105608003B (zh) * | 2015-12-17 | 2018-04-17 | 西安电子科技大学 | 基于控制流分析和数据流分析的Java程序静态分析方法 |
JP6919338B2 (ja) * | 2017-05-30 | 2021-08-18 | オムロン株式会社 | プログラム開発支援装置、プログラム開発支援システム、プログラム開発支援方法、および、プログラム開発支援プログラム |
CN110489294B (zh) * | 2019-08-23 | 2023-12-19 | 上海光电医用电子仪器有限公司 | 一种基于日志实时单步调试方法和装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102789419A (zh) * | 2012-07-20 | 2012-11-21 | 中国人民解放军信息工程大学 | 一种使用多样本差异比对的软件故障分析方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8584108B2 (en) * | 2010-03-29 | 2013-11-12 | GM Global Technology Operations LLC | Method and apparatus for analyzing software |
-
2012
- 2012-11-29 CN CN201210495957.9A patent/CN102968372B/zh not_active Expired - Fee Related
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102789419A (zh) * | 2012-07-20 | 2012-11-21 | 中国人民解放军信息工程大学 | 一种使用多样本差异比对的软件故障分析方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102968372A (zh) | 2013-03-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102968372B (zh) | 具有程序分析功能的程序调试系统 | |
US9658907B2 (en) | Development tools for refactoring computer code | |
CN103092761B (zh) | 基于差异信息文件识别和检查修改代码块的方法及装置 | |
US20140358507A1 (en) | Partitioning block diagrams into executable contextual models | |
Böhm et al. | xSim: The extreme-scale simulator | |
CN100435111C (zh) | 异构环境下支持多语言多平台的并行调试及性能分析方法 | |
US20070277163A1 (en) | Method and tool for automatic verification of software protocols | |
CN110249300B (zh) | 内置于数据集成工作流编辑器中的测试用例生成器 | |
Ferenc et al. | Extracting facts from open source software | |
Kothari et al. | Deriving state machines from TinyOS programs using symbolic execution | |
Biswal et al. | A novel approach for scenario-based test case generation | |
Xu et al. | Experience mining Google's production console logs | |
Remenska et al. | Using model checking to analyze the system behavior of the LHC production grid | |
CN102880474A (zh) | 并行源代码生成、编译及驱动执行的测试方法 | |
CN104199713A (zh) | 一种嵌入式Linux操作系统裁剪定制方法 | |
CN110286882B (zh) | 一种基于模型检测的前台系统设计与验证方法 | |
Kauhanen et al. | Regression test selection tool for python in continuous integration process | |
EP3465422A1 (en) | Format-specific data processing operations | |
Liu et al. | Identifying change patterns of API misuses from code changes | |
WO2023038715A1 (en) | Hot reloading a running application with an unsaved source code change | |
CN104461883B (zh) | 基于程序执行轨迹的过程间动态程序切片系统 | |
US7222064B1 (en) | Instruction processor emulation having inter-processor messaging accounting | |
CN110750258A (zh) | 一种基于xml的可重用监控软件设计方法 | |
CN111008140A (zh) | 一种跨平台的ui自动化测试方法及装置 | |
US11327723B1 (en) | Development environment integrated with failure detection system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160511 Termination date: 20161129 |
|
CF01 | Termination of patent right due to non-payment of annual fee |