基于路径特征的程序执行轨迹状态自动获取方法

文档序号:6633000阅读:658来源:国知局
基于路径特征的程序执行轨迹状态自动获取方法
【专利摘要】本发明公开了一种基于路径特征的程序执行轨迹状态自动获取方法,通过静态分析程序数据流和控制流结构定义程序路径的特征集合及相关的推理规则,并利用程序执行的路径特征自动地推理每个程序节点在该次执行中的(一个或多个)状态;对于多条需要获知节点状态的路径可以同时计算,过程简便,成本低廉。
【专利说明】基于路径特征的程序执行轨迹状态自动获取方法

【技术领域】
[0001] 本发明涉及一种基于路径特征的程序执行轨迹状态自动获取方法,属于软件维护 中的故障定位领域。

【背景技术】
[0002] 故障定位是软件维护过程中最重要的步骤之一,通过对测试中的程序正确执行和 失效执行的分析来对程序中故障可能存在的位置进行推测,主要有人工、自动化和半自动 化等几类方法。人工定位方法依赖于软件工程师的经验及其对该程序的熟知程度,往往效 率较低,过程难以控制;自动化或半自动化方法通过比对程序执行中的各类信息对程序各 个位置可能存在故障的可能性进行计算,能够处理大规模的程序和执行,效率较高,应用广 泛,同时定位精度成为了每种方法的关键要素。
[0003] 节点状态是概率化故障定位方法中普遍采用的一种信息,此类方法通过各个节点 在执行中的状态来分析故障的产生可能由哪些节点的执行(或不执行)所引起。由于对程 序执行进行了具体、真实的分析,一般定位精度较高,效果较好。但是此类方法需要程序源 码、执行路径和节点状态三项输入,尤其是节点的状态涉及复杂的变量定义和使用,较为难 以获得。
[0004] 针对这一问题,目前普遍采用的方法较为简单,一般通过插桩的方式使得目标程 序在执行过程中能够记录所有执行节点的状态。由于程序中节点众多,每个节点可能含有 多个状态分量,所以这种处理方式效率很低。本发明考虑通过抽取路径的实质特征来精简 插桩节点,并通过结合静态分析的方法减免部分收集节点状态分量的工作。


【发明内容】

[0005] 技术问题:本发明提供一种利用程序的执行路径和源码信息来自动计算执行中 各个节点每次出现的状态,能够根据源码分析出静态视图中各个节点的变量定义和使用情 况,信息易于获取、运行效率高的基于路径特征的程序执行轨迹状态自动获取方法。
[0006] 技术方案:本发明的基于路径特征的程序执行轨迹状态自动获取方法,包括如下 步骤:
[0007] 步骤1)通过静态分析程序源码获知程序控制流图和所述程序控制流图中每个节 点N的定义变量集合{dN}、使用变量集合{%};
[0008] 步骤2)从所述程序控制流图中抽取能作为程序特征的边,组成特征集合{EJ,然 后用所述特征的序列表示每条路径;
[0009] 步骤3)通过程序控制流图、{dN}、{%}和{Ex}推导出"特征序列-节点状态"推理 规则,所述推理规则由条件和结论两部分组成,所述条件是特征序列,所述结论是路径中一 个节点的一项状态分量,基于推理规则,能够通过任一条路径中的特征序列计算该路径中 每个节点的状态分量;
[0010] 步骤4)针对待分析的每条执行路径,通过推理规则和该路径的特征序列计算路 径上每个节点的所有状态分量,最终得到的每个节点的状态;
[0011] 步骤5)对于所述步骤4)中计算得到的状态分量为空的节点,即未涉及任何变量 的节点,将其状态标记为T,符号T表示执行。
[0012] 本发明方法的优选方案中,步骤3)中推导出"特征序列-节点状态"理规则的具 体流程为:
[0013] (a)针对程序中涉及的每个变量,统计出每个变量Vi的定义节点集合{Ni},i为变 量编号
[0014] (b)计算从{NJ中每个节点Na到每个使用变量Vi的节点N b之间的必经特征集合 {Ed}和禁止特征集合{Ef} = (E1, E2,…,EJ,m为集合{Ef}中元素的个数;
[0015] (c)按照如下规则将所述{Ed}和{Ef}组合为特征序列:对于{E d}中的每个元素 Ex,从Ex到节点Nb的路径不经过禁止特征集合{Ef};
[0016] (d)以所述特征序列为条件、Nb:da (Vi)为结论,构建得到"特征序列-节点状态"推 理规则 Ex (E1, E2,…,Em) = >Nb: da (Vi)。
[0017] 本发明方法中,步骤b)中,必要特征集合为:从节点Na到节点Nb的不经过{NJ中 任意元素的路径所必然经过的特征组成的集合;禁止特征集合为:从节点Na到节点Nb的不 经过{NJ中任意元素的路径所必然不经过的特征组成的集合。
[0018] 本发明方法的优选方案中,步骤4)中计算路径上节点的状态分量的具体流程为:
[0019] (a)以路径中节点作为分割点,将路径对应的特征序列划分为前后两段;
[0020] (b)以该节点之前的特征序列片段匹配每条"特征序列-节点状态"推理规则,在 符合规则的条件下推导出该节点的每个状态分量;
[0021] (C)组合该节点的所有状态分量,即得到该节点的状态。
[0022] 本发明方法的优选方案中,步骤2)中抽取的能作为程序路径的边为程序控制流 图中程序入口边和所有不属于最小生成树的边。
[0023] 本发明方法主要是利用程序的执行路径结合静态的源码分析自动地统计程序执 行中各个节点的状态,以降低基于节点状态的故障定位技术的应用成本。
[0024] 有益效果:本发明方法通过结合路径执行特征和源码分析结合的方式自动计算执 行中的节点转台,与现有技术相比,本发明具有以下优点:
[0025] (1)需要的信息易于获取。概率化的故障定位技术(如PPDG,Probabilistic Program Dependency Graph) -般需要三项输入:执行路径、程序源码和节点状态,现有方 法对执行路径和节点状态这两项的信息收集过程是独立的,需要分别进行,而本发明方法 以路径特征序列和程序源码作为输入,进行节点状态的计算,减少了对输入信息的要求。
[0026] (2)计算成本低廉。现有方法收集执行路径和计算节点状态时分别需要在程序源 码上进行插桩,记录执行路径以及每个变量的定义和使用情况。本发明方法通过定义路径 特征来简化路径表示,减少了插桩的数量(收集执行路径和计算节点状态时,仅需要在路 径特征处实施插桩),进而减少了插桩语句对程序执行效率的影响,与现有方法相比提高了 运行效率。

【专利附图】

【附图说明】
[0027] 图1是本发明方法的流程图。
[0028] 图2是本发明的路径特征例图,用于说明对执行路径的特征定义和实现。
[0029] 图3是图2中的最小生成树。
[0030] 图4是图2中路径特征集合。
[0031] 图5是本发明的推理规则例图。表示本发明中对相关推理规则的设计和应用。
[0032] 图6是本发明的实施例图。表示实施例中相关内容。

【具体实施方式】
[0033] 下面结合附图对发明的技术方案进行详细说明:
[0034] 本发明利用程序执行的路径信息和所执行语句的数据定义、使用信息,通过自动 化的路径特征提取和推理,对程序执行轨迹状态进行计算,强调计算过程的简单易行和计 算结果的精确性。
[0035] 一、体系结构
[0036] 图1给出了基于路径特征的程序执行轨迹状态自动获取方法设计体系结构。下面 给出几个主要部分的具体说明。
[0037] 1静态分析组件
[0038] 本组件的功能为:通过分析目标程序的源码,获取相关的控制流信息和数据流信 息,进而通过分析控制流信息得出该程序执行的路径特征集合,并通过结合控制流和数据 流的信息构建路径特征与执行轨迹状态之间的推理规则。。
[0039] 路径特征集合是程序控制流图中所有边的一个子集。本发明中使用的路径特征包 括程序入口边和控制流图中所有不属于最小生成树的边。假设有如图2的程序结构,其中 包含四个程序节点A、B、C和D,以及五条边AB、BC、CB、⑶和DB。该程序的一个最小生成树 如图3所示,那么可以得到路径特征为{AB,CB,DB},如图4中双线所示。
[0040] 特征所构成的序列与程序中所有的路径--对应。如图2中路径ABCBCD,其特征 序列为AB、CB,对比图可知符合该特征序列的路径只有ABCB⑶。
[0041] 节点状态的每个分量是一个该节点使用变量的定义情况,即在执行到该节点时, 所执行到的每个变量最后一个定义位置。这样的位置与程序执行有关,可以从程序控制流 图中归纳该位置对应的执行路径的特点,将这一特点转化为等价的特征序列;那么当一次 执行符合这一特征序列时,即可判定该执行位置处的节点状态包含相应的状态分量。
[0042] 为说明推理规则,做如下定义:
[0043] 必经特征:从节点A到节点B,必然经过的特征。
[0044] 必要特征:指的是在给定的路径约束中,必然经过的特征。
[0045] 禁止特征:指的是在给定的路径约束中,必然不经过的特征。
[0046] 例如,在图2的控制流图中,假设路径约束为"从节点C到节点D,中间不经过节点 B",那么必要特征集合为空集,禁止特征集合为{CB}。必经特征可以使用类似必经节点的计 算方法进行计算,而必要特征和禁止特征需要使用必经特征进行计算。
[0047] 本发明中的推理规则是以路径特征组成的条件为前提、以节点状态分量为结论的 推理表达式。其前提条件由必要特征和禁止特征组合而成(必要特征和禁止特征均来自路 径特征集合),而结论由节点和状态分量组成。
[0048] 推理规则的含义为:对于推理规则A,在程序执行到当前节点N时,已经执行的路 径特征边的序列必须按照顺序包含A前提条件中的每条必要特征,且在相应的位置不包含 任何禁止特征,那么在对节点N的状态进行推理时,可以使用规则A。
[0049] 例如,假设有程序局部结构为图5,包含N1?N6六个节点,E 1?E6六条边。假设 有三条针对节点N6的推理规则:
[0050] a) E1 (E2, E3) = > N6: dm (x)
[0051] WE3(E1) = > N6: dn (y)
[0052] c)E2 = > N6: dk (y)
[0053] 这些规则的含义为:
[0054] 1)推理规则中符号"=>"左侧的是前提条件,右侧的是结论;
[0055] 2)前提条件中括号内为禁止特征,括号外为必要特征,E1(E21E3)表示:执行到当 前节点时,E1必须执行过,且在E1执行之后,没有执行E2或E 3。
[0056] 3)结论中冒号左侧为节点,如N6表示使用推理规则时,N6为当前节点;结论中冒 号右侧为状态分量,如dm (X)表示N6在该处执行时使用的变量X定义来自于语句m,-T表示 N6的状态为已执行。
[0057] 2插桩组件
[0058] 本组件的主要功能是在每个路径特征处插桩语句,以自动化地在目标程序执行过 程中收集相应的路径特征序列,作为获取程序节点状态的前提。
[0059] 目前已有很多种Program Tracing和Path Profiling领域中的技术可以完成这一 工作,如 Whole Program Paths、Profiling of All Paths 等。
[0060] 3执行和路径特征收集组件
[0061] 本组件的主要功能是使用给定的测试用例运行插桩后的目标程序,在程序的执行 过程中自动收集所执行的路径特征;并删除重复的执行路径,将剩余的执行所对应的路径 特征存储,作为进一步计算程序节点状态的信息。
[0062] 4节点状态获取组件
[0063] 本组件的主要功能是基于已获取的路径特征和推理规则,对该次执行中每个执行 位置的节点状态进行推理,获知节点状态,为其他程序分析和故障定位技术提供帮助。
[0064] 二、具体过程
[0065] 本发明方法通过抽取程序特征的方式简化程序执行路径,结合程序的静态信息进 行执行路径中的节点状态计算,具体过程为:
[0066] 步骤1)抽取程序静态信息。因为每个节点的状态包括该节点处所使用的每个变 量的定义来源,所以节点状态的计算和变量的"定义-使用"关系密不可分。通过现有的静 态分析技术,可以自动地从程序源码中获取程序控制流图和所述程序控制流图中每个节点 N的定义变量集合{dN}、使用变量集合{%};
[0067] 步骤2)定义程序特征。由于程序结构存在顺序关系,由所执行的边的序列所组成 的程序路径中的信息存在冗余,这增加了计算工作。为了删除冗余信息,从所述程序控制流 图中抽取程序控制流图中程序入口边和所有不属于最小生成树的边,以这些边作为特征, 组成特征集合{EJ,然后用所述特征的序列表示每条路径,达到压缩路径长度、简化计算的 效果;
[0068] 步骤3)构建推理规则。进而通过程序控制流图、{dN}、{%}和{Ex}推导出"特征 序列-节点状态"推理规则,所述推理规则由条件和结论两部分组成,所述条件是特征序列, 所述结论是路径中一个节点的一项状态分量,基于推理规则,能够通过任一条路径中的特 征序列计算该路径中每个节点的状态分量。推导步骤包括:
[0069] (a)针对程序中涉及的每个变量,统计出每个变量Vi的定义节点集合{NJ,i为变 量编号;
[0070] (b)计算从{NJ中每个节点Na到每个使用变量Vi的节点N b之间的必经特征集合 {Ed}和禁止特征集合{Ef} = (E1, E2,…,EJ,m为集合{Ef}中元素的个数;
[0071] (c)按照如下规则将所述{Ed}和{Ef}组合为特征序列:对于{E d}中的每个元素 Ex,从Ex到节点Nb的路径不经过禁止特征集合{Ef};
[0072] (d)以所述特征序列为条件、Nb:da (Vi)为结论,构建得到"特征序列-节点状态"推 理规则 Ex (E1, E2,…,Em) = >Nb: da (Vi)。
[0073] 步骤4)计算节点状态。针对待分析的每条执行路径,通过推理规则和该路径的特 征序列计算路径上面每个节点的所有状态分量,最终得到的每个节点的状态。计算步骤包 括:
[0074] (a)以路径中节点作为分割点,将路径对应的特征序列划分为前后两段;
[0075] (b)以该节点之前的特征序列片段匹配每条"特征序列-节点状态"推理规则,在 符合规则的条件下推导出该节点的每个状态分量;
[0076] (C)组合该节点的所有状态分量,即得到该节点的状态。
[0077] 步骤5)处理未计算节点。对于所述步骤4)中计算得到的状态分量为空的节点, 即未涉及任何变量的节点,将其状态标记为-T,符号-T表不执行。
[0078] 三、实施例
[0079] 为了方便描述,我们假定有如下简化的应用实例:目标程序源码如下所示,共有9 条语句。
[0080]

【权利要求】
1. 一种基于路径特征的程序执行轨迹状态自动获取方法,其特征在于,该方法包括如 下步骤: 步骤1)通过静态分析程序源码获知程序控制流图和所述程序控制流图中每个节点N 的定义变量集合{dN}、使用变量集合{uN}; 步骤2)从所述程序控制流图中抽取能作为程序特征的边,组成特征集合{Ex},然后用 所述特征的序列表示每条路径; 步骤3)通过程序控制流图、{dN}、{%}和{Ex}推导出"特征序列-节点状态"推理规 贝U,所述推理规则由条件和结论两部分组成,所述条件是特征序列,所述结论是路径中一个 节点的一项状态分量,基于推理规则,能够通过任一条路径中的特征序列计算该路径中每 个节点的状态分量; 步骤4)针对待分析的每条执行路径,通过推理规则和该路径的特征序列计算路径上 每个节点的所有状态分量,最终得到的每个节点的状态; 步骤5)对于所述步骤4)中计算得到的状态分量为空的节点,即未涉及任何变量的节 点,将其状态标记为丁,符号丁表不执行。
2. 根据权利要求1所述的基于路径特征的程序执行轨迹状态自动获取方法,其特征在 于,所述步骤3)中推导出"特征序列-节点状态"推理规则的具体流程为: (a) 针对程序中涉及的每个变量,统计出每个变量Vi的定义节点集合{Nj,i为变量编 号; (b) 计算从{NJ中每个节点凡到每个使用变量¥1的节点Nb之间的必经特征集合{Ed} 和禁止特征集合{Ef} = {Ed E2,…,Em},m为集合{Ef}中元素的个数; (c) 按照如下规则将所述{Ed}和{Ef}组合为特征序列:对于{Ed}中的每个元素E x,从 Ex到节点Nb的路径不经过禁止特征集合{Ef}; (d) 以所述特征序列为条件、Nb:da(Vi)为结论,构建得到"特征序列-节点状态"推理 规则 Ex E2,…,Em) = >Nb: da (vD。
3. 根据权利要求1或2所述的基于路径特征的程序执行轨迹状态自动获取方法,其特 征在于,所述步骤b)中,必要特征集合为:从节点Na到节点Nb的不经过{NJ中任意元素 的路径所必然经过的特征组成的集合;所述禁止特征集合为:从节点Na到节点Nb的不经过 {NJ中任意元素的路径所必然不经过的特征组成的集合。
4. 根据权利要求1或2所述的基于路径特征的程序执行轨迹状态自动获取方法,其特 征在于,所述步骤4)中计算路径上节点的状态分量的具体流程为: (a) 以路径中节点作为分割点,将路径对应的特征序列划分为前后两段; (b) 以该节点之前的特征序列片段匹配每条"特征序列-节点状态"推理规则,在符合 规则的条件下推导出该节点的每个状态分量; (c) 组合该节点的所有状态分量,即得到该节点的状态。
5. 根据权利要求4所述的基于路径特征的程序执行轨迹状态自动获取方法,其特征在 于:所述步骤2)中抽取的能作为程序路径的边为程序控制流图中程序入口边和所有不属 于最小生成树的边。
【文档编号】G06F11/36GK104407969SQ201410609913
【公开日】2015年3月11日 申请日期:2014年11月3日 优先权日:2014年11月3日
【发明者】王璐璐, 李必信, 廖力, 周颖 申请人:东南大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1