CN102789420A - 基于程序执行轨迹的动态切片系统 - Google Patents

基于程序执行轨迹的动态切片系统 Download PDF

Info

Publication number
CN102789420A
CN102789420A CN2012102564705A CN201210256470A CN102789420A CN 102789420 A CN102789420 A CN 102789420A CN 2012102564705 A CN2012102564705 A CN 2012102564705A CN 201210256470 A CN201210256470 A CN 201210256470A CN 102789420 A CN102789420 A CN 102789420A
Authority
CN
China
Prior art keywords
analysis
statement
program
information
module
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.)
Granted
Application number
CN2012102564705A
Other languages
English (en)
Other versions
CN102789420B (zh
Inventor
姜淑娟
王兴亚
李海洋
张艳梅
李威
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
China University of Mining and Technology CUMT
Original Assignee
China University of Mining and Technology CUMT
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by China University of Mining and Technology CUMT filed Critical China University of Mining and Technology CUMT
Priority to CN201210256470.5A priority Critical patent/CN102789420B/zh
Publication of CN102789420A publication Critical patent/CN102789420A/zh
Application granted granted Critical
Publication of CN102789420B publication Critical patent/CN102789420B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

本发明涉及一种基于程序执行轨迹的动态切片系统,包括系统获得程序的执行路径信息、对Java的.class文件进行静态分析、对程序执行轨迹中每个序列的每条语句的附加变量集进行分析、对源程序中每条语句直接控制依赖结点的获取、对程序执行轨迹中每个序列的每条语句进行附加控制依赖工作及完成对Java过程内程序进行动态切片的功能。在程序切片的过程中不需要对程序进行回溯,大大提高了算法的效率,根据控制依赖关系和变量的定义引用信息提高了切片的精度。

Description

基于程序执行轨迹的动态切片系统
技术领域
本发明涉及一种在软件开发过程中进行程序切片的方法,尤其是不仅可以有效处理复杂大型程序,而且可以提高切片精度的基于程序执行轨迹的动态切片系统。
背景技术
随着软件规模的日益增大,传统的调试技术不能够有效的处理复杂大型程序。大型应用系统通常有数百行的代码,程序开发人员往往不能够快速的理解程序中的代码,这给程序的调试和维护工作带来了很大的困难。而程序切片是一种程序分析技术,用来将大程序分解成小片段,删除一些与兴趣点不相关的语句,帮助开发人员从中提取感兴趣的部分。其概念和原理由M.Weiser于1979年首次建立。使用程序切片技术,将简化程序分析和理解的难度,加速程序的测试和调试工作,缩短程序的开发和维护时间。
程序P中的切片准则可以表示成一个二元组<P,V>,其中P是程序中的一条语句,V是在n处定义或引用的变量集合。关于该切片准则的切片将包含哪些影响和控制P处变量V的值得语句。程序切片的计算可以看作一个图的可达性问题,是在系统依赖上找出可达节点。系统依赖图由一个或多个程序依赖图组成。每个过程依赖图表示一个过程内的控制依赖和数据依赖关系。在系统依赖图中,每个过程的依赖图被连接起来,这些边表示过程间的数据依赖和控制依赖。
程序切片可以分为静态程序切片和动态程序切片。针对给定的切片准则,两者主要的差异在于进行切片时所需要的信息不同,静态程序切片仅需要程序的静态信息,即源程序;而动态程序切片需要根据程序的输入,记录程序的整个执行轨迹。静态程序切片考虑的是程序所有的执行情况,而动态切片仅考虑程序针对某一输入的特定执行情况。因此,动态切片包含的语句更少,结果更精确些。然而,动态程序切片需要的程序执行轨迹在获取和储存方面都受到时间和空间的限制。优化过的动态切片算法需要数分钟到几十分钟,其前期的准备时间更长,所以动态切片的算法优化是一个很重要的问题。
发明内容
为了克服现有的动态切片算法其效率和精度较低的问题,本发明提供一种基于程序执行轨迹的动态切片系统,该动态切片系统依据堆栈跟踪进行切片的方法,首先利用调试器的信息记录程序执行轨迹,找出该次执行中涉及的语句;在记录程序执行轨迹的同时计算程序的控制依赖关系得到程序切片,在程序切片的过程中不需要对程序进行回溯,大大提高了算法的效率,根据控制依赖关系和变量的定义引用信息提高了切片的精度。
本发明解决其技术问题所采用的技术方案是:
本系统使用eclipse进行开发,可以对Java程序进行动态程序切片。依据程序动态执行轨迹进行程序切片需要依据以下六步进行:
(1)系统获得程序的执行路径信息,即Path Analysis,获取当前执行语句的信息。在得到当前执行语句的信息,对这些信息进行数据依赖分析,即DefVars or UseVars Analysis,得到当前执行语句的定义变量集和使用变量集。
模块核心功能是获得待分析语句一次完整执行的执行序号ExecutionNum和语句行号LineNum。执行序号比较好分析,它是从1开始,并每次加1的执行序列,即1 2 3 4…n,其中n表示最后执行的序号。每个执行序号对应一个语句行号,表示程序第ExecutionNum执行语句LineNum,因为分析过程内程序,不需要考虑不同的类、不同的方法。
语句行号需要从虚拟机获取。在处理ThreadStartEvent时,即程序即将开始执行,设置StepRequest,虚拟机开始单步执行程序。单步执行的效果是在每条语句执行前,单步执行事件StepEvent发生,执行语句的线程被挂起,调试器获得当前的执行位置信息Location,通过其模块可以获得当前执行的行号信息。信息获取完成后,恢复挂起的线程。
(2)对Java的.class文件进行静态分析,实现了对Java源文件中每条语句中定义变量集DefVars和使用变量集UseDefs的获取功能。
(2a)首先,初始化Soot,完成Soot的初始设置工作。Soot是一种用于Java优化的框架,它为不同的分析目的提供了四种不同的中间表示,这里需要做的是对Soot中的Jimple这一中间表示进行分析。Jimple是一种基于类型的3地址格式语句的中间表示,是一种介于Java源代码和Java字节码的中间表示。
该模块是对中间表示Jimple进行分析,获得源文件的信息,因此在初始化工作中,需要进行一些设置,如Jimple中间表示的行号为源代码中行号,Jimple中间表示的变量名为源代码中变量名。只有通过这些设置,模块才可以获得完整、准确的源代码信息,对源代码完成DefVars or UseVars Analysis工作。
(2b)完成Soot初始化工作后,接着需要做的便是获取需要分析的类和方法。因为DynamicSlicer4j系统分析目标是Java过程内程序,因此,只需获取类中的main方法即可。Soot会对待分析的类和方法分别建立自己的Soot类和Soot方法,即SootClass和SootMethod,并为Soot方法建立方法体SootBody,这样就可利用Soot各个类提供的方法进行分析,大大提高分析的效率。
(2c)通过SootBody,模块可以获得该方法中任一语句,Jimple中间表示的Soot实例,用Unit表示。Unit保存了该语句的所有信息,模块只需从中获取需要的信息就可以了,即该语句的行号或该语句中的定义集合和使用集合,这样,模块即可实现DefVars or UseVars Analysis功能。
(2d)Unit中的信息并非即得即用的,Unit保存的是Jimple中间表示的每一条语句,而源代码中往往一条语句会有多条Jimple代码,因此,如何将多条Jimple代码获得的信息集中到各自相应的Java源代码,是一个需要处理的问题。还有,模块通过调用Unit中的方法,可以轻易获取Unit中的定义集合和使用集合,模块需要的定义变量集合Def Vars和使用变量集合Use Vars就包含其中,如果把它们从中剥离出来,也是一个需要处理的问题。而且在处理获得定义变量集合Def Vars和使用变量集合Use Vars时,还需要将在Jimple中间表示中产生的不属于Java源代码的临时变量去除掉。
通过步骤(2a)、(2b)、(2c)及(2d)的处理,才能获得完整的、准确的定义变量集合Def Vars和使用变量集合Use Vars,由此完成执行DefVars or UseVars Analysis功能。
(3)对程序执行轨迹中每个序列的每条语句的附加变量集进行分析,该附加变量集包括DefVars和UseVars。该模块对Path Analysis和DefVars or UseVars Analysis两个模块的结果进行解析,分别获取必须的信息,并将这些信息按结构有规律、有顺序的组合在一起,形成可供中间分析的结果。
(3a)路径变量分析Variable Types Analysis模块实现对程序执行轨迹中每个序列的每条语句的附加变量集进行DefVars和UseVars处理工作。该模块对Path Analysis和DefVars or UseVars Analysis两个模块的结果进行解析,分别获取必须的信息,并将这些信息按结构有规律、有顺序的组合在一起,形成可供中间分析的结果。
(3b)Variable Types Analysis模块将Path Analysis和DefVars or UseVars Analysis两个模块的结果文件读入到内存中,分别保存在DocDA和DocSA 中,同时在内存中生成自己的结构DocVTA;模块解析DocDA和DocSA,将解析的结果存入到DocVTA中。
模块解析在思想上是并发的,Doc之间互相不干预。遍历DocDA和DocSA中的元素,在内存中保存各个元素的信息,DocVTA使用这些信息。但在实际执行过程中,考虑到空间问题和效率问题,模块是顺序执行的。
模块首先计算程序执行序列,获得本次执行序号ExecutionNum,将ExecutionNum记录到DocVTA中。通过ExecutionNum在DocDA中获得当前执行的类名ClassName,包括包名以及当前执行语句所在Java源文件的行号LineNum,将获得的ClassName与LineNum记录到DocVTA中。通过ClassName和LineNum信息,模块在DocSA中查找到相应元素的信息,包括定义变量集合DefVariables,使用变量集合UseVariables,变量类型VariableType,变量名称VariableName;这些信息将被DocVTA使用,构建自己的结构。
通过这样的流程,一次执行的Variable Types Analysis完成,而通过遍历整个执行序列,模块对程序一次执行的Variable Types Analysis完成。
(4)控制依赖分析Control Dependence Analysis模块是基于Soot开发的一个模块,它对java的.class文件进行静态分析,实现了对源程序中每条语句直接控制依赖结点的获取功能。
(4a)模块首先获取待分析的类,生成待分析类的Soot实例SootClass,再从中获取待分析的方法,即类中的main方法,生成待分析方法的Soot实例SootMethod,并为SootMethod建立方法体SootBody,通过Soot提供的BriefUnitGraph类为方法建立控制流图CFG。至此,模块使用Soot对程序进行处理结束。
(4b)在完成CFG流图的建立后,接下来需要做的就是寻找控制流图中各个结点的控制依赖关系。为了从控制流图CFG获取各结点的控制依赖关系,首先要建立控制流图的后必经树Post Domiante Tree,再利用相应算法对后必经树进行处理,以此获得后必经树PDT中部分结点的控制依赖于关系Control Depends,最后通过对控制依赖于关系的处理,获得控制流图中各个结点的控制依赖关系Control Dependence。
(5)对程序执行轨迹中每个序列的每条语句进行附加控制依赖工作。该模块对Variable Type Analysis和Control Dependence Analysis两个模块的结果进行解析,分别获取必须的信息,并将这些信息按结构有规律、有顺序的组合在一起,形成可供切片的最终中间结果。
(5a)首先计算程序执行序列,获得本次执行序号ExecutionNum,将ExecutionNum记录到DocInterA中。通过ExecutionNum在DocVTA中获得当前执行的类名ClassName,包括包名以及当前执行语句所在Java源文件的行号LineNum,将获得的ClassName与LineNum记录到DocInterA中。
(5b)通过ClassName和LineNum信息,模块在DocVTA和DocCDA中分别查找到相应元素的信息。在DocVTA中查找定义变量集合DefVariables,使用变量集合UseVariables,变量类型VariableType,变量名称VariableName,在DocCDA中查找控制依赖信息,这些信息将被DocInterA使用,构建自己的结构。
通过这样的流程,一次执行的Intermediate Analysis完成。而通过遍历整个执行序列,模块对程序一次执行的Intermediate Analysis完成。
该模块去除了前面两个模块分析结果的冗余信息,是更高层模块精确分析的基础。不仅如此,Intermediate Analysis是中间信息处理的最后一步,它集合了对程序进行切片处理所需的信息。
(6)系统完成对Java过程内程序进行动态切片的功能。该模块对Intermediate Analysis的结果进行解析,获取切片必要的信息。
(6a)首先,获取Intermediate Analysis Results的一次执行的信息,这些信息保存在一个ExecutionNum元素中,从信息中模块可以获得行号信息LineNum,此时模块就可以对序号为ExecutionNum行号为LineNum的语句结点做NodeSlice。NodeSlice获得的切片由三部分组成,分别是语句本身切片,结点直接控制依赖Control Dependence结点的切片,结点所有使用变量Use Variables的切片。
(6b)语句本身很简单,就是将语句行号加入到NodeSlice中。结点直接控制依赖Control Dependence结点的切片指结点的最近的直接控制依赖结点的切片。结点所有使用变量Use Variables的切片中在该结点出现的所有使用变量,它们各自切片的并集。得到三种切片后,对它们做并集处理,得到的结果即是序号为ExecutionNum行号为LineNum语句结点的NodeSlice。
对于行号为LineNum的语句,若它的使用变量在其中并没有被重定义,也就是语句执行前后它本身并没有发生实质性变化。因此,语句中的使用变量的切片在语句执行前后并未发生变化。
对于行号为LineNum的语句,若它的定义变量在其中被重定义,在语句执行前后它本身发生了实质性变化。因此,语句中的定义变量的切片在语句执行前后发生了变化。由于它的变化是由该语句引起的,因此,语句执行后,它的切片与语句的切片NodeSlice相同。
(6c)NodeSlice完成后,需要修改或添加结点中所有定义变量的切片,它们的切片与NodeSlice相同,而使用变量的切片没有发生改变。
本发明的有益效果是,该动态切片系统依据堆栈跟踪进行切片的方法,首先利用调试器的信息记录程序执行轨迹,找出该次执行中涉及的语句;在记录程序执行轨迹的同时计算程序的控制依赖关系得到程序切片,在程序切片的过程中不需要对程序进行回溯,大大提高了算法的效率,根据控制依赖关系和变量的定义引用信息提高了切片的精度。
附图说明
下面结合附图和实施例对本发明作进一步说明。
图1是本发明的Path Analysis模块流程图。
图2是本发明的DefVars or UseVars Analysis模块流程图。
图3 是本发明的Variable Types Analysis模块核心解析流程图。
图4 是本发明的Control Dependence Analysis模块总体流程图。
图5是本发明的Intermediate Analysis 模块核心解析流程图。    
图6是本发明的Slicer模块算法流程图。
具体实施方式
为了便于利用程序执行轨迹对程序进行切片,我们首先对切片过程的依赖关系进行定义:
定义1  控制依赖:如果程序中语句u和w满足以下三个条件,那么就称w直接控制依赖于u;
1)从u到w之间存在一条路径P;
2)从P上除u,w之外的每个节点v,节点w都是它的后向必经节点;
3)节点w不是节点u的后向必经节点。
定义2  控制依赖图G(N,E),N表示程序中语句对应的节点集合,E表示边集,其中每条边表示w控制依赖于u。
定义3  数据依赖:如果程序中,语句u对变量v进行了定义,w引用了变量v的值,并且u到w之间存在一条路径,该路径上没有对v进行重新定义,那么就称w关于变量v直接数据依赖于w。
定义4  数据依赖图G(N,E),N表示程序中语句对应的节点集合,E表示边集,其中每条边表示w直接数据依赖于u。
在图中,该基于程序执行轨迹的动态切片系统的计算和设计包括如下步骤:
(1)系统获得程序的执行路径信息,即Path Analysis,获取当前执行语句的信息。在得到当前执行语句的信息,对这些信息进行数据依赖分析,即DefVars or UseVars Analysis,得到当前执行语句的定义变量集和使用变量集。
模块核心功能是获得待分析语句一次完整执行的执行序号ExecutionNum和语句行号LineNum。执行序号比较好分析,它是从1开始,并每次加1的执行序列,即1 2 3 4…n,其中n表示最后执行的序号。每个执行序号对应一个语句行号,表示程序第ExecutionNum执行语句LineNum,因为分析过程内程序,不需要考虑不同的类、不同的方法。
语句行号需要从虚拟机获取。在处理ThreadStartEvent时,即程序即将开始执行,设置StepRequest,虚拟机开始单步执行程序。单步执行的效果是在每条语句执行前,单步执行事件StepEvent发生,执行语句的线程被挂起,调试器获得当前的执行位置信息Location,通过其模块可以获得当前执行的行号信息。信息获取完成后,恢复挂起的线程。
(2)对Java的.class文件进行静态分析,实现了对Java源文件中每条语句中定义变量集DefVars和使用变量集UseDefs的获取功能。
(2a)首先,初始化Soot,完成Soot的初始设置工作。Soot是一种用于Java优化的框架,它为不同的分析目的提供了四种不同的中间表示,这里需要做的是对Soot中的Jimple这一中间表示进行分析。Jimple是一种基于类型的3地址格式语句的中间表示,是一种介于Java源代码和Java字节码的中间表示。
该模块是对中间表示Jimple进行分析,获得源文件的信息,因此在初始化工作中,需要进行一些设置,如Jimple中间表示的行号为源代码中行号,Jimple中间表示的变量名为源代码中变量名。只有通过这些设置,模块才可以获得完整、准确的源代码信息,对源代码完成DefVars or UseVars Analysis工作。
(2b)完成Soot初始化工作后,接着需要做的便是获取需要分析的类和方法。因为DynamicSlicer4j系统分析目标是Java过程内程序,因此,只需获取类中的main方法即可。Soot会对待分析的类和方法分别建立自己的Soot类和Soot方法,即SootClass和SootMethod,并为Soot方法建立方法体SootBody,这样就可利用Soot各个类提供的方法进行分析,大大提高分析的效率。
(2c)通过SootBody,模块可以获得该方法中任一语句,Jimple中间表示的Soot实例,用Unit表示。Unit保存了该语句的所有信息,模块只需从中获取需要的信息就可以了,即该语句的行号或该语句中的定义集合和使用集合,这样,模块即可实现DefVars or UseVars Analysis功能。
(2d)Unit中的信息并非即得即用的,Unit保存的是Jimple中间表示的每一条语句,而源代码中往往一条语句会有多条Jimple代码,因此,如何将多条Jimple代码获得的信息集中到各自相应的Java源代码,是一个需要处理的问题。还有,模块通过调用Unit中的方法,可以轻易获取Unit中的定义集合和使用集合,模块需要的定义变量集合Def Vars和使用变量集合Use Vars就包含其中,如果把它们从中剥离出来,也是一个需要处理的问题。而且在处理获得定义变量集合Def Vars和使用变量集合Use Vars时,还需要将在Jimple中间表示中产生的不属于Java源代码的临时变量去除掉。
通过步骤(2a)、(2b)、(2c)及(2d)的处理,才能获得完整的、准确的定义变量集合Def Vars和使用变量集合Use Vars,由此完成执行DefVars or UseVars Analysis功能。
(3)对程序执行轨迹中每个序列的每条语句的附加变量集进行分析,该附加变量集包括DefVars和UseVars。该模块对Path Analysis和DefVars or UseVars Analysis两个模块的结果进行解析,分别获取必须的信息,并将这些信息按结构有规律、有顺序的组合在一起,形成可供中间分析的结果。
(3a)路径变量分析Variable Types Analysis模块实现对程序执行轨迹中每个序列的每条语句的附加变量集进行DefVars和UseVars处理工作。该模块对Path Analysis和DefVars or UseVars Analysis两个模块的结果进行解析,分别获取必须的信息,并将这些信息按结构有规律、有顺序的组合在一起,形成可供中间分析的结果。
(3b)Variable Types Analysis模块将Path Analysis和DefVars or UseVars Analysis两个模块的结果文件读入到内存中,分别保存在DocDA和DocSA 中,同时在内存中生成自己的结构DocVTA;模块解析DocDA和DocSA,将解析的结果存入到DocVTA中。
模块解析在思想上是并发的,Doc之间互相不干预。遍历DocDA和DocSA中的元素,在内存中保存各个元素的信息,DocVTA使用这些信息。但在实际执行过程中,考虑到空间问题和效率问题,模块是顺序执行的。
模块首先计算程序执行序列,获得本次执行序号ExecutionNum,将ExecutionNum记录到DocVTA中。通过ExecutionNum在DocDA中获得当前执行的类名ClassName,包括包名以及当前执行语句所在Java源文件的行号LineNum,将获得的ClassName与LineNum记录到DocVTA中。通过ClassName和LineNum信息,模块在DocSA中查找到相应元素的信息,包括定义变量集合DefVariables,使用变量集合UseVariables,变量类型VariableType,变量名称VariableName;这些信息将被DocVTA使用,构建自己的结构。
通过这样的流程,一次执行的Variable Types Analysis完成,而通过遍历整个执行序列,模块对程序一次执行的Variable Types Analysis完成。
(4)控制依赖分析Control Dependence Analysis模块是基于Soot开发的一个模块,它对java的.class文件进行静态分析,实现了对源程序中每条语句直接控制依赖结点的获取功能。
(4a)模块首先获取待分析的类,生成待分析类的Soot实例SootClass,再从中获取待分析的方法,即类中的main方法,生成待分析方法的Soot实例SootMethod,并为SootMethod建立方法体SootBody,通过Soot提供的BriefUnitGraph类为方法建立控制流图CFG。至此,模块使用Soot对程序进行处理结束。
(4b)在完成CFG流图的建立后,接下来需要做的就是寻找控制流图中各个结点的控制依赖关系。为了从控制流图CFG获取各结点的控制依赖关系,首先要建立控制流图的后必经树Post Domiante Tree,再利用相应算法对后必经树进行处理,以此获得后必经树PDT中部分结点的控制依赖于关系Control Depends,最后通过对控制依赖于关系的处理,获得控制流图中各个结点的控制依赖关系Control Dependence。
(5)对程序执行轨迹中每个序列的每条语句进行附加控制依赖工作。该模块对Variable Type Analysis和Control Dependence Analysis两个模块的结果进行解析,分别获取必须的信息,并将这些信息按结构有规律、有顺序的组合在一起,形成可供切片的最终中间结果。
(5a)首先计算程序执行序列,获得本次执行序号ExecutionNum,将ExecutionNum记录到DocInterA中。通过ExecutionNum在DocVTA中获得当前执行的类名ClassName,包括包名以及当前执行语句所在Java源文件的行号LineNum,将获得的ClassName与LineNum记录到DocInterA中。
(5b)通过ClassName和LineNum信息,模块在DocVTA和DocCDA中分别查找到相应元素的信息。在DocVTA中查找定义变量集合DefVariables,使用变量集合UseVariables,变量类型VariableType,变量名称VariableName,在DocCDA中查找控制依赖信息,这些信息将被DocInterA使用,构建自己的结构。
通过这样的流程,一次执行的Intermediate Analysis完成。而通过遍历整个执行序列,模块对程序一次执行的Intermediate Analysis完成。
该模块去除了前面两个模块分析结果的冗余信息,是更高层模块精确分析的基础。不仅如此,Intermediate Analysis是中间信息处理的最后一步,它集合了对程序进行切片处理所需的信息。
系统完成对Java过程内程序进行动态切片的功能。该模块对Intermediate Analysis的结果进行解析,获取切片必要的信息。
(6a)首先,获取Intermediate Analysis Results的一次执行的信息,这些信息保存在一个ExecutionNum元素中,从信息中模块可以获得行号信息LineNum,此时模块就可以对序号为ExecutionNum行号为LineNum的语句结点做NodeSlice。NodeSlice获得的切片由三部分组成,分别是语句本身切片,结点直接控制依赖Control Dependence结点的切片,结点所有使用变量Use Variables的切片。
(6b)语句本身很简单,就是将语句行号加入到NodeSlice中。结点直接控制依赖Control Dependence结点的切片指结点的最近的直接控制依赖结点的切片。结点所有使用变量Use Variables的切片中在该结点出现的所有使用变量,它们各自切片的并集。得到三种切片后,对它们做并集处理,得到的结果即是序号为ExecutionNum行号为LineNum语句结点的NodeSlice。
对于行号为LineNum的语句,若它的使用变量在其中并没有被重定义,也就是语句执行前后它本身并没有发生实质性变化。因此,语句中的使用变量的切片在语句执行前后并未发生变化。
对于行号为LineNum的语句,若它的定义变量在其中被重定义,在语句执行前后它本身发生了实质性变化。因此,语句中的定义变量的切片在语句执行前后发生了变化。由于它的变化是由该语句引起的,因此,语句执行后,它的切片与语句的切片NodeSlice相同。
(6c)NodeSlice完成后,需要修改或添加结点中所有定义变量的切片,它们的切片与NodeSlice相同,而使用变量的切片没有发生改变。

Claims (6)

1.基于程序执行轨迹的动态切片系统,其特征是:包括如下步骤:
(1)系统获得程序的执行路径信息,即Path Analysis,获取当前执行语句的信息;在得到当前执行语句的信息,对这些信息进行数据依赖分析,即DefVars or UseVars Analysis,得到当前执行语句的定义变量集和使用变量集;
(2)对Java的.class文件进行静态分析,实现了对Java源文件中每条语句中定义变量集DefVars和使用变量集UseDefs的获取功能;
(3)对程序执行轨迹中每个序列的每条语句的附加变量集进行分析,该附加变量集包括DefVars和UseVars;该模块对Path Analysis和DefVars or UseVars Analysis两个模块的结果进行解析,分别获取必须的信息,并将这些信息按结构有规律、有顺序的组合在一起,形成可供中间分析的结果;
(4)控制依赖分析Control Dependence Analysis模块是基于Soot开发的一个模块,它对java的.class文件进行静态分析,实现了对源程序中每条语句直接控制依赖结点的获取功能;
(5)对程序执行轨迹中每个序列的每条语句进行附加控制依赖工作;该模块对Variable Type Analysis和Control Dependence Analysis两个模块的结果进行解析,分别获取必须的信息,并将这些信息按结构有规律、有顺序的组合在一起,形成可供切片的最终中间结果;
(6)系统完成对Java过程内程序进行动态切片的功能;该模块对Intermediate Analysis的结果进行解析,获取切片必要的信息。
2.根据权利要求1所述的基于程序执行轨迹的动态切片系统,其特征是::所述步骤(2)中的对Java的.class文件进行静态分析包括如下步骤:
(2a)首先,初始化Soot,完成Soot的初始设置工作;
(2b)完成Soot初始化工作后,接着需要做的便是获取需要分析的类和方法;
(2c)通过SootBody,模块可以获得该方法中任一语句,Jimple中间表示的Soot实例,用Unit表示;
(2d)在处理获得定义变量集合Def Vars和使用变量集合Use Vars时,还需要将在Jimple中间表示中产生的不属于Java源代码的临时变量去除掉。
3.根据权利要求1所述的基于程序执行轨迹的动态切片系统,其特征是:所述步骤(3)中的对程序执行轨迹中每个序列的每条语句的附加变量集进行分析包括如下步骤:
(3a)路径变量分析Variable Types Analysis模块实现对程序执行轨迹中每个序列的每条语句的附加变量集进行DefVars和UseVars处理工作;
(3b)Variable Types Analysis模块将Path Analysis和DefVars or UseVars Analysis两个模块的结果文件读入到内存中,分别保存在DocDA和DocSA 中,同时在内存中生成自己的结构DocVTA。
4.根据权利要求1所述的基于程序执行轨迹的动态切片系统,其特征是:所述步骤(4)中的控制依赖分析包括如下步骤:
(4a)模块首先获取待分析的类,生成待分析类的Soot实例SootClass,再从中获取待分析的方法,即类中的main方法,生成待分析方法的Soot实例SootMethod,并为SootMethod建立方法体SootBody,通过Soot提供的BriefUnitGraph类为方法建立控制流图CFG;
(4b)在完成CFG流图的建立后,接下来需要做的就是寻找控制流图中各个结点的控制依赖关系。
5.根据权利要求1所述的基于程序执行轨迹的动态切片系统,其特征是:所述步骤(5)中的对程序执行轨迹中每个序列的每条语句进行附加控制依赖工作包括如下步骤:
(5a)首先计算程序执行序列,获得本次执行序号ExecutionNum,将ExecutionNum记录到DocInterA中;
(5b)通过ClassName和LineNum信息,模块在DocVTA和DocCDA中分别查找到相应元素的信息。
6.根据权利要求1所述的基于程序执行轨迹的动态切片系统,其特征是:所述步骤(6)中的对Intermediate Analysis的结果进行解析包括如下步骤:
(6a)首先,获取Intermediate Analysis Results的一次执行的信息,这些信息保存在一个ExecutionNum元素中,从信息中模块可以获得行号信息LineNum,此时模块就可以对序号为ExecutionNum行号为LineNum的语句结点做NodeSlice;
(6b)将语句行号加入到NodeSlice中;
(6c)NodeSlice完成后,需要修改或添加结点中所有定义变量的切片。
CN201210256470.5A 2012-07-24 2012-07-24 基于程序执行轨迹的动态切片系统 Expired - Fee Related CN102789420B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210256470.5A CN102789420B (zh) 2012-07-24 2012-07-24 基于程序执行轨迹的动态切片系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210256470.5A CN102789420B (zh) 2012-07-24 2012-07-24 基于程序执行轨迹的动态切片系统

Publications (2)

Publication Number Publication Date
CN102789420A true CN102789420A (zh) 2012-11-21
CN102789420B CN102789420B (zh) 2016-01-20

Family

ID=47154825

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210256470.5A Expired - Fee Related CN102789420B (zh) 2012-07-24 2012-07-24 基于程序执行轨迹的动态切片系统

Country Status (1)

Country Link
CN (1) CN102789420B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102968375A (zh) * 2012-11-30 2013-03-13 中国矿业大学 基于关联规则挖掘的不可达路径检测方法
CN103905391A (zh) * 2012-12-26 2014-07-02 腾讯科技(深圳)有限公司 僵尸网络命令和控制协议的获取方法及装置
CN104461883A (zh) * 2014-12-03 2015-03-25 中国矿业大学 基于程序执行轨迹的过程间动态程序切片系统
CN108304317A (zh) * 2017-12-28 2018-07-20 东南大学 一种基于路径执行频率的单过程程序静态切片方法及系统
CN108595334A (zh) * 2018-04-27 2018-09-28 刘尚国 一种计算Java程序动态切片的方法、装置及可读存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101739339A (zh) * 2009-12-29 2010-06-16 北京航空航天大学 一种基于程序动态依赖关系的软件故障定位方法
CN101894073A (zh) * 2010-08-17 2010-11-24 北京航空航天大学 基于控制流交集的缺陷自动定位装置及其自动定位方法
JP2011253363A (ja) * 2010-06-02 2011-12-15 Hitachi Ltd アプリケーションの解析方法、解析システム及び解析プログラム

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101739339A (zh) * 2009-12-29 2010-06-16 北京航空航天大学 一种基于程序动态依赖关系的软件故障定位方法
JP2011253363A (ja) * 2010-06-02 2011-12-15 Hitachi Ltd アプリケーションの解析方法、解析システム及び解析プログラム
CN101894073A (zh) * 2010-08-17 2010-11-24 北京航空航天大学 基于控制流交集的缺陷自动定位装置及其自动定位方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
王雪莲等: "一种用于测试数据生成的动态程序切片算法", 《计算机应用》, vol. 25, no. 6, 30 June 2005 (2005-06-30) *
贾利敏等: "一种简化依赖关系的动态程序切片算法", 《郑州大学学报(工学版)》, vol. 30, no. 2, 30 June 2009 (2009-06-30), pages 84 - 87 *

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102968375A (zh) * 2012-11-30 2013-03-13 中国矿业大学 基于关联规则挖掘的不可达路径检测方法
CN102968375B (zh) * 2012-11-30 2015-10-28 中国矿业大学 基于关联规则挖掘的不可达路径检测方法
CN103905391A (zh) * 2012-12-26 2014-07-02 腾讯科技(深圳)有限公司 僵尸网络命令和控制协议的获取方法及装置
CN103905391B (zh) * 2012-12-26 2018-01-30 腾讯科技(深圳)有限公司 僵尸网络命令和控制协议的获取方法及装置
CN104461883A (zh) * 2014-12-03 2015-03-25 中国矿业大学 基于程序执行轨迹的过程间动态程序切片系统
CN104461883B (zh) * 2014-12-03 2017-11-14 中国矿业大学 基于程序执行轨迹的过程间动态程序切片系统
CN108304317A (zh) * 2017-12-28 2018-07-20 东南大学 一种基于路径执行频率的单过程程序静态切片方法及系统
CN108595334A (zh) * 2018-04-27 2018-09-28 刘尚国 一种计算Java程序动态切片的方法、装置及可读存储介质
CN108595334B (zh) * 2018-04-27 2021-08-13 刘尚国 一种计算Java程序动态切片的方法、装置及可读存储介质

Also Published As

Publication number Publication date
CN102789420B (zh) 2016-01-20

Similar Documents

Publication Publication Date Title
Fan et al. Migrating monolithic mobile application to microservice architecture: An experiment report
CN106599197B (zh) 数据采集交换引擎
CN102693183B (zh) 一种实现软件自动化测试的方法及系统
CN105550268B (zh) 大数据流程建模分析引擎
CN105022691B (zh) 一种基于uml图的高度自动化软件测试方法
CN109359094B (zh) 一种分布式系统日志全链路追踪方法及装置
CN106649100A (zh) 一种自动化测试方法及系统
CN105095059B (zh) 一种自动化测试的方法和装置
CN102789420A (zh) 基于程序执行轨迹的动态切片系统
CN103942099B (zh) 基于Hive的并行执行任务方法及装置
CN202339542U (zh) 一种软件产品测试系统
Yang The application of mapreduce in the cloud computing
CN106301892A (zh) 基于Apache Ambari的Hue服务部署及配置和监控办法
CN110019203A (zh) 一种基于知识库的服务器自动巡检系统与方法
CN104331315A (zh) 一种任意层次json对象的解析与生成方法及系统
CN104268056A (zh) 基于复杂事件处理的面向cps应用的实时监控系统及方法
CN104572474A (zh) 一种基于动态切片的轻量级错误定位技术实现方法
CN106445645A (zh) 用于执行分布式计算任务的方法和装置
CN115794106A (zh) 一种轨道交通二进制协议数据配置式解析的方法及系统
US10838843B1 (en) Parsing hierarchical session log data for search and analytics
CN103744788B (zh) 基于多源软件数据分析的特征定位方法
CN106096159A (zh) 一种云平台下的分布式系统行为仿真分析系统的实现方法
CN115934097A (zh) 生成可执行语句的方法、装置、存储介质及电子装置
CN105824741A (zh) 可灵活扩展的it系统运行数据采集方法及系统
Chaturvedi Automated web service change management AWSCM-A tool

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
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20160120

Termination date: 20160724