一种基于程序动态依赖关系的软件故障定位方法技术

技术编号:4272238 阅读:407 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种基于程序动态依赖关系的软件故障定位方法,包括:基于作用于链接时的优化器,获取静态控制依赖信息;动态插装可执行程序,搜集动态执行轨迹信息;解析轨迹信息,得到动态依赖关系;再根据动态依赖关系的可疑度公式,计算每动态依赖关系的可疑度;然后将可疑度的值映射到程序的可执行语句上;最后将各语句按照可疑度的大小进行降序排列,输出软件故障定位的报告。开发者可以按可疑度从大到小的顺序对代码进行审查,减少程序调试阶段的必须检查的代码范围和数量,提高定位程序故障的效率。本发明专利技术具有自动化程度高、定位准确度高的优点。

【技术实现步骤摘要】

本专利技术涉及计算机软件自动化调试技术,尤其涉及。
技术介绍
软件调试,是软件开发过程中发现和减少软件缺陷的一个过程,通常始于程序出现故障以后。软件故障一般通过三个阶段产生程序员在代码中制造了一个缺陷,缺陷造成了程序中的错误状态,错误状态进而引发了程序故障,它以可感知的外部错误的形式出现。随后,程序员会执行某个失败的测试用例,使用调试器反复设置断点,观察程序状态直到错误状态的出现。然后推断可能的感染源,定位缺陷位置并验证,修正软件缺陷。当前,软件中的某些缺陷或错误,可以通过改进软件开发环境,静态的探测源代码或动态的检查对不变量的违反来辅助发现;而绝大多数错误,则只能依赖于开发人员的经验和直觉,通过人工的方式来发现。 人工审查代码,以及在程序中插入输出语句或断言,单步执行跟踪缺陷轨迹等方法的效率很低,软件开发人员在调试上花费了大量的时间和精力——据统计大约要占去工作的一半甚至更多,这也是软件系统中的缺陷难以在开发过程中充分修复的一个重要原因。另外,调试需要对于程序的功能和实现有较深入的理解,是一件比较困难的工作,所以调试任务通常只能由程序的开发人员来完成,其他人员难以胜任,这样一来就会影响软件的开发速度。 手工调试已经难以适应软件质量保证和快速开发的双重要求。如果有自动化的调试方法,可以根据测试用例的状态信息,以及各种程序实体执行的覆盖信息,指出软件缺陷在源代码中可能存在的位置,无疑将极大的提高软件生产率和软件质量。 程序依赖关系反映了程序实体之间相互作用的关系。它包含两种数据依赖关系和控制依赖关系。数据依赖关系表示由于数据的定义和使用形成的实体之间的关系。通俗的讲,如果两条语句存在数据依赖关系,当调换这两条语句时,则会使得其中至少一条语句中使用的变量的值不正确。控制依赖关系表示由于控制流引起的程序实体之间的关系。通俗的讲,如果一个谓词表达式的值会影响到一条语句是否被执行,则语句控制依赖于谓词表达式。从程序是否被执行的角度,程序依赖关系又可以分为静态依赖关系和动态依赖关系两种。静态依赖关系显示了实体间所有可能的相互作用关系,而动态依赖关系则表明了某次执行中程序实体相互作用的情况。 在回归测试,每日构建,测试驱动的开发等软件开发的一些场景中,由于软件版本的变更,经常会在源代码中引入难以发现的缺陷。针对这些缺陷的调试工作会很频繁和烦琐。但同时,在这些场景中,程序的源代码,一套测试组件的状态信息和程序的动态依赖关系都是可以获得的。因此,研究一种使用程序动态依赖关系和测试用例状态信息的故障定位技术,对于提高软件生产率和软件质量,有着重要的意义。
技术实现思路
有鉴于此,本专利技术的主要目的在于提供,通过搜集C语言执行时的轨迹信息,解析动态依赖关系,计算出可执行语句的可疑度,并将它们由大到小排列,以故障定位报告的形式给出,提高了调试的自动化程度,从而提升软件的开发速度。 为达到上述目的,本专利技术的技术方案是这样实现的 —种基于程序动态依赖关系的软件故障定位方法,该方法包括 A.使用作用于链接时的优化器,获取程序源文件中存在的静态控制依赖信息,编译源文件为可执行文件,并对其进行动态二进制插装; B.根据得到的静态控制依赖信息,基于一组测试用例集执行程序,搜集其动态执行轨迹信息,并判定每个测试用例通过或失败的状态; C.解析所得到的轨迹信息,得到可执行语句间的动态依赖关系; D.根据所生成的动态依赖关系,运用依赖关系的可疑度计算公式,计算每条动态依赖关系的可疑度,然后将可疑度的值映射到对应的可执行语句上; E.将各语句按照可疑度从大到小进行降序排列,输出软件故障定位的报告。 其中,所述被定位的程序源代码文件为C语言。 所述软件故障类型包括两类 数据流相关的故障,包括存在于变量定义,变量使用,变量重定义,变量删除,常量值的改变等程序操作中的故障; 控制流相关的故障,包括存在于不必要的代码块的添加,路径的删除,谓词条件的定义,执行顺序的改变,外部函数的访问,函数值的返回等程序操作中的故障。 步骤A所述的作用于链接时的优化器,是一种重写链接器,其输入为目标文件和库文件,而不是程序的可执行文件。 步骤A所述的动态二进制插装过程,是利用一个基于动态插装工具,通过在程序执行的过程中插入二进制分析代码来获取程序性能信息的过程。 步骤B所述的动态执行轨迹信息,包括 Bl.被执行的指令信息 B2.被执行的依赖关系 B3.当前指令所产生的值 信息块Bl所述中的指令信息,包含了指令的唯一编号,使用的依赖关系的个数,指令对应的文件名和语句行号。 信息块B2所述中的依赖关系,包含了被依赖的指令的编号。此外,第一条依赖关系总是表示控制依赖关系,可以为空。之后的依赖关系均是数据依赖关系。 信息块B3所述中的值,包含了当前指令定义的值,它们可以是变量的值或者是变量的地址或为空,并以十六进制的形式表示。 步骤C所述的解析过程,包括 CI.解析得到可执行语句间动态控制依赖关系的过程 C2.解析得到可执行语句间动态数据依赖关系的过程 步骤C1所述的过程,是根据B2中的信息得到指令间的动态控制依赖关系,再根据Bl中指令和可执行语句间的映射关系,得到可执行语句间的动态控制依赖关系的解析过 程。 步骤C2所述的过程,是根据B2中的信息得到指令间的动态数据依赖关系,如果B3 中的值是变量的值而非变量的地址,则根据Bl中指令和可执行语句间的映射关系,得到可 执行语句之间的动态数据依赖关系的解析过程。 步骤D所述的可疑度计算公式,包括如下信息 Dl.动态数据或动态控制依赖关系出现在通过的测试用例中的次数 D2.动态数据或动态控制依赖关系出现在失败的测试用例中的次数 D3.整套测试组件通过的测试用例的个数 D4.整套测试组件失败的测试用例的个数 步骤E所述的报告,为辅助程序员进行软件故障定位,按可疑度从大到小排列可 执行语句,包括了如下信息El.可执行语句所在文件名E2.可执行语句所在行号E3.可执行语句所在的动态控制依赖关系的个数E4.可执行语句所在的动态数据依赖关系的个数E5.可执行语句的可疑度E6.可执行语句的可疑度排名附图说明 图1为本专利技术基于程序动态依赖关系的软件故障定位方法流程示意图。 具体实施例方式下面结合附图及本专利技术的实施例对本专利技术的方法作进一步详细的说明。本专利技术的基本思想为首先使用链接时的优化器处理源文件,得到静态的控制依赖关系;再通过动态插装工具,执行测试组件,并得到测试用例状态和执行轨迹信息;然后解析执行轨迹信息得到动态依赖关系;由可疑度计算公式得到动态依赖关系的可疑度,并映射到可执行语句上;最后,根据可执行语句的可疑度,生成故障定位报告。图1为本专利技术基于程序动态依赖关系的软件故障定位方法流程示意图;如图1所示,该方法包括如下步骤 步骤101 :链接时优化器根据源代码编译生成的二进制文件得到静态控制依赖关 系。 这里,所谓链接时优化为软件编译技术术语。它表示由链接器执行的操作,发生在 编译之后程序执行之前。链接器是一个程序,将一个或多个编译器或汇编器生成的目标文 件外加库链接为一个可执行文件。目标文件是包括机器码和链接器可用信息的程序模块。 简单的讲,链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号 的地址。链接本文档来自技高网
...

【技术保护点】
一种基于程序动态依赖关系的软件故障定位方法,其特征在于,该方法包括:A.使用作用于链接时的优化器,获取程序源文件中存在的静态控制依赖信息,编译源文件为可执行文件,并对其进行动态二进制插装;B.根据得到的静态控制依赖信息,基于一组测试用例集执行程序,搜集其动态执行轨迹信息,并判定每个测试用例通过或失败的状态;C.解析所得到的轨迹信息,得到可执行语句间的动态依赖关系;D.根据所生成的动态依赖关系,运用依赖关系的可疑度计算公式,计算每条动态依赖关系的可疑度,然后将可疑度的值映射到对应的可执行语句上;E.将各语句按照可疑度从大到小进行降序排列,输出软件故障定位的报告。

【技术特征摘要】
一种基于程序动态依赖关系的软件故障定位方法,其特征在于,该方法包括A.使用作用于链接时的优化器,获取程序源文件中存在的静态控制依赖信息,编译源文件为可执行文件,并对其进行动态二进制插装;B.根据得到的静态控制依赖信息,基于一组测试用例集执行程序,搜集其动态执行轨迹信息,并判定每个测试用例通过或失败的状态;C.解析所得到的轨迹信息,得到可执行语句间的动态依赖关系;D.根据所生成的动态依赖关系,运用依赖关系的可疑度计算公式,计算每条动态依赖关系的可疑度,然后将可疑度的值映射到对应的可执行语句上;E.将各语句按照可疑度从大到小进行降序排列,输出软件故障定位的报告。2. 根据权利要求l所述的定位方法,其特征在于,所述被定位的程序源文件为C语言代 码文件。3. 根据权利要求1所述的定位方法,其特征在于,所述软件故障类型包括两类 数据流相关的故障,包括存在于变量定义,变量使用,变量重定义,变量删除,常量值的改变;控制流相关的故障,包括存在于不必要的代码块的添加,路径的删除,谓词条件的定 义,执行顺序的改变,外部函数的访问,函数值的返回。4. 根据权利要求1所述的方法,其特征在于,步骤A所述的作用于链接时的优化器,是 一种重写链接器,其输入为目标文件和库文件,而不是程序的可执行文件。5. 根据权利要求1所述的方法,其特征在于,步骤A所述的动态二进制插装过程,是利 用一个动态插装工具,通过在程序执行的过程中插入二进制分析代码来获取程序性能信息 的过程。6. 根据权利要求1所述的方法,其特征在于,步骤B所述的动态执行轨迹信息,包括了 Bl.被执行的指令信息;B2.被执行的依赖关系; B3.当前指令所产生的值。7. 根据权利要求6所述的方法,其特征在于,信息块B1中的指令信息,包含了指令的唯 一编号,使用的依赖关系的个数,指令对应的文件名和语句行号。8. 根据权利要求6所述的方法,...

【专利技术属性】
技术研发人员:虞凯李未
申请(专利权)人:北京航空航天大学
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1