首页> 中国专利> 一种基于程序动态依赖关系的软件故障定位方法

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

摘要

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

著录项

  • 公开/公告号CN101739339A

    专利类型发明专利

  • 公开/公告日2010-06-16

    原文格式PDF

  • 申请/专利权人 北京航空航天大学;

    申请/专利号CN200910244115.4

  • 发明设计人 虞凯;李未;

    申请日2009-12-29

  • 分类号G06F11/36(20060101);

  • 代理机构11251 北京科迪生专利代理有限责任公司;

  • 代理人李新华

  • 地址 100191 北京市海淀区学院路37号

  • 入库时间 2023-12-18 00:27:04

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-02-22

    未缴年费专利权终止 IPC(主分类):G06F11/36 授权公告日:20130327 终止日期:20151229 申请日:20091229

    专利权的终止

  • 2013-03-27

    授权

    授权

  • 2011-06-08

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20091229

    实质审查的生效

  • 2010-06-16

    公开

    公开

说明书

技术领域

本发明涉及计算机软件自动化调试技术,尤其涉及一种基于程序动态依赖关系的软件故障定位方法。

背景技术

软件调试,是软件开发过程中发现和减少软件缺陷的一个过程,通常始于程序出现故障以后。软件故障一般通过三个阶段产生:程序员在代码中制造了一个缺陷,缺陷造成了程序中的错误状态,错误状态进而引发了程序故障,它以可感知的外部错误的形式出现。随后,程序员会执行某个失败的测试用例,使用调试器反复设置断点,观察程序状态直到错误状态的出现。然后推断可能的感染源,定位缺陷位置并验证,修正软件缺陷。

当前,软件中的某些缺陷或错误,可以通过改进软件开发环境,静态的探测源代码或动态的检查对不变量的违反来辅助发现;而绝大多数错误,则只能依赖于开发人员的经验和直觉,通过人工的方式来发现。

人工审查代码,以及在程序中插入输出语句或断言,单步执行跟踪缺陷轨迹等方法的效率很低,软件开发人员在调试上花费了大量的时间和精力——据统计大约要占去工作的一半甚至更多,这也是软件系统中的缺陷难以在开发过程中充分修复的一个重要原因。另外,调试需要对于程序的功能和实现有较深入的理解,是一件比较困难的工作,所以调试任务通常只能由程序的开发人员来完成,其他人员难以胜任,这样一来就会影响软件的开发速度。

手工调试已经难以适应软件质量保证和快速开发的双重要求。如果有自动化的调试方法,可以根据测试用例的状态信息,以及各种程序实体执行的覆盖信息,指出软件缺陷在源代码中可能存在的位置,无疑将极大的提高软件生产率和软件质量。

程序依赖关系反映了程序实体之间相互作用的关系。它包含两种:数据依赖关系和控制依赖关系。数据依赖关系表示由于数据的定义和使用形成的实体之间的关系。通俗的讲,如果两条语句存在数据依赖关系,当调换这两条语句时,则会使得其中至少一条语句中使用的变量的值不正确。控制依赖关系表示由于控制流引起的程序实体之间的关系。通俗的讲,如果一个谓词表达式的值会影响到一条语句是否被执行,则语句控制依赖于谓词表达式。从程序是否被执行的角度,程序依赖关系又可以分为静态依赖关系和动态依赖关系两种。静态依赖关系显示了实体间所有可能的相互作用关系,而动态依赖关系则表明了某次执行中程序实体相互作用的情况。

在回归测试,每日构建,测试驱动的开发等软件开发的一些场景中,由于软件版本的变更,经常会在源代码中引入难以发现的缺陷。针对这些缺陷的调试工作会很频繁和烦琐。但同时,在这些场景中,程序的源代码,一套测试组件的状态信息和程序的动态依赖关系都是可以获得的。因此,研究一种使用程序动态依赖关系和测试用例状态信息的故障定位技术,对于提高软件生产率和软件质量,有着重要的意义。

发明内容

有鉴于此,本发明的主要目的在于提供一种基于程序动态依赖关系的软件故障定位方法,通过搜集C语言执行时的轨迹信息,解析动态依赖关系,计算出可执行语句的可疑度,并将它们由大到小排列,以故障定位报告的形式给出,提高了调试的自动化程度,从而提升软件的开发速度。

为达到上述目的,本发明的技术方案是这样实现的:

一种基于程序动态依赖关系的软件故障定位方法,该方法包括:

A.使用作用于链接时的优化器,获取程序源文件中存在的静态控制依赖信息,编译源文件为可执行文件,并对其进行动态二进制插装;

B.根据得到的静态控制依赖信息,基于一组测试用例集执行程序,搜集其动态执行轨迹信息,并判定每个测试用例通过或失败的状态;

C.解析所得到的轨迹信息,得到可执行语句间的动态依赖关系;

D.根据所生成的动态依赖关系,运用依赖关系的可疑度计算公式,计算每条动态依赖关系的可疑度,然后将可疑度的值映射到对应的可执行语句上;

E.将各语句按照可疑度从大到小进行降序排列,输出软件故障定位的报告。

其中,所述被定位的程序源代码文件为C语言。

所述软件故障类型包括两类:

数据流相关的故障,包括存在于变量定义,变量使用,变量重定义,变量删除,常量值的改变等程序操作中的故障;

控制流相关的故障,包括存在于不必要的代码块的添加,路径的删除,谓词条件的定义,执行顺序的改变,外部函数的访问,函数值的返回等程序操作中的故障。

步骤A所述的作用于链接时的优化器,是一种重写链接器,其输入为目标文件和库文件,而不是程序的可执行文件。

步骤A所述的动态二进制插装过程,是利用一个基于动态插装工具,通过在程序执行的过程中插入二进制分析代码来获取程序性能信息的过程。

步骤B所述的动态执行轨迹信息,包括:

B1.被执行的指令信息

B2.被执行的依赖关系

B3.当前指令所产生的值

信息块B1所述中的指令信息,包含了指令的唯一编号,使用的依赖关系的个数,指令对应的文件名和语句行号。

信息块B2所述中的依赖关系,包含了被依赖的指令的编号。此外,第一条依赖关系总是表示控制依赖关系,可以为空。之后的依赖关系均是数据依赖关系。

信息块B3所述中的值,包含了当前指令定义的值,它们可以是变量的值或者是变量的地址或为空,并以十六进制的形式表示。

步骤C所述的解析过程,包括:

C1.解析得到可执行语句间动态控制依赖关系的过程

C2.解析得到可执行语句间动态数据依赖关系的过程

步骤C1所述的过程,是根据B2中的信息得到指令间的动态控制依赖关系,再根据B1中指令和可执行语句间的映射关系,得到可执行语句间的动态控制依赖关系的解析过程。

步骤C2所述的过程,是根据B2中的信息得到指令间的动态数据依赖关系,如果B3中的值是变量的值而非变量的地址,则根据B1中指令和可执行语句间的映射关系,得到可执行语句之间的动态数据依赖关系的解析过程。

步骤D所述的可疑度计算公式,包括如下信息:

D1.动态数据或动态控制依赖关系出现在通过的测试用例中的次数

D2.动态数据或动态控制依赖关系出现在失败的测试用例中的次数

D3.整套测试组件通过的测试用例的个数

D4.整套测试组件失败的测试用例的个数

步骤E所述的报告,为辅助程序员进行软件故障定位,按可疑度从大到小排列可执行语句,包括了如下信息:

E1.可执行语句所在文件名

E2.可执行语句所在行号

E3.可执行语句所在的动态控制依赖关系的个数

E4.可执行语句所在的动态数据依赖关系的个数

E5.可执行语句的可疑度

E6.可执行语句的可疑度排名

附图说明

图1为本发明基于程序动态依赖关系的软件故障定位方法流程示意图。

具体实施方式

下面结合附图及本发明的实施例对本发明的方法作进一步详细的说明。

本发明的基本思想为:首先使用链接时的优化器处理源文件,得到静态的控制依赖关系;再通过动态插装工具,执行测试组件,并得到测试用例状态和执行轨迹信息;然后解析执行轨迹信息得到动态依赖关系;由可疑度计算公式得到动态依赖关系的可疑度,并映射到可执行语句上;最后,根据可执行语句的可疑度,生成故障定位报告。

图1为本发明基于程序动态依赖关系的软件故障定位方法流程示意图;如图1所示,该方法包括如下步骤:

步骤101:链接时优化器根据源代码编译生成的二进制文件得到静态控制依赖关系。

这里,所谓链接时优化为软件编译技术术语。它表示由链接器执行的操作,发生在编译之后程序执行之前。链接器是一个程序,将一个或多个编译器或汇编器生成的目标文件外加库链接为一个可执行文件。目标文件是包括机器码和链接器可用信息的程序模块。简单的讲,链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号的地址。链接器还要完成程序中各目标文件的地址空间的组织,这可能设计重定位工作。

所述静态控制依赖关系是指不执行程序,仅分析程序源代码,得到的程序语句和谓词间可能存在的控制依赖关系。

步骤102:动态插装工具执行测试组件,并根据静态控制依赖关系,生成执行轨迹信息。同时得到测试组件中各测试用例通过或失败的状态。

这里,所谓动态插装为软件工程术语,是借助往被测程序中插入操作(称为“探针”),以便获取程序的控制流和数据流信息,从而实现测试目的的方法。

测试组件为软件工程术语,是测试用例的一组集合,用来测试某个程序是否有特定的一些行为。一个测试套件通常也包含对于每个测试用例如何使用和在测试过程中应收集哪些信息的详细说明。

执行轨迹信息是程序执行过程的指令流信息的记录,一般完整地记录了程序执行过程中所执行指令的内容和顺序。

测试用例的通过或失败状态即可通过人工的方式判定,也可以通过和已知的测试谕示对比而得到。

步骤103:根据所得到的轨迹信息,解析产生可执行语句间的动态依赖关系。

这里,解析产生的动态依赖关系包括动态控制依赖关系和动态数据依赖关系。它们分别表示在程序执行中由于控制流和数据流而引起的语句之间的相互作用。

步骤104:根据所生成的动态依赖关系,运用依赖关系的可疑度计算公式,计算每条动态依赖关系的可疑度,然后将可疑度的值映射到对应的可执行语句上。

为说明依赖关系的可疑度计算公式,引入如下记号:

ctrldep(a,b):表示一条控制依赖关系,语句b控制依赖于语句a

datadep(a,b):表示一条数据依赖关系,语句b数据依赖于语句a

dep(a,b):表示一条依赖关系,可以是ctrldep(a,b)也可以是datadep(a,b)

failed(dep(a,b)):表示依赖关系dep(a,b)出现在失败测试用例中的次数

passed(dep(a,b)):表示依赖关系dep(a,b)出现在通过测试用例中的次数

totalfailed:表示测试组件中失败测试用例总共的个数

由上,依赖关系的可疑度计算公式定义如下:

susp(dep(a,b))=failed(dep(a,b))totalfailed×(failed(dep(a,b)+passed(dep(a,b))

为说明如何将依赖关系的可疑度映射到语句上,引入如下记号:

First(s):表示语句行号i的集合,i与语句s间有依赖关系dep(s,i)

Second(s):表示语句行号j的集合,j与语句s间有依赖关系dep(j,s)

susp(s)=Σisusp(dep(s,i))+Σjsusp(dep(j,s))|First(s)|+|Second(s)|iFirst(s),jSecond(s)

步骤105:将得到的各语句的可疑度按从大到小排序,输出语句所在的文件名,行号,动态控制依赖关系的个数,动态数据依赖关系的个数,可疑度及排名,产生程序故障定位报告。

综上所述,程序动态依赖关系的收集和可疑度计算模型是本发明的核心。最终产生的故障定位报告,可供开发者按可疑度从大到小的顺序对可疑代码进行审查,减少程序调试阶段的必须检查的代码范围和数量,提高定位程序故障的效率。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号