软件故障定位

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

传统调试技术

软件开发者使用的典型的软件调试技术主要有两种:

(1)在程序中插入打印语句使得程序输出用以被分析的附加信息,可以对程

序的运行时状态有一个粗略了解。一个通常的做法是插入打印语句以指

示某个控制条件到达了某个特定程序点;另一个通常做法是插入打印语

句以输出变量的值。当程序被执行的时候,程序生成可以被开发者检查的

附加调试输出。缺点:调试输出可能相当的大,打印语句的放置和输出的

检查都是非组织和临时的,分析和放置位置也通常是基于直觉的

(2) 另一种技术是使用符号调试器。一个符号调试器是一个用来调试其他程

序的计算机程序,符号调试器支持例如断点、单步跳过、状态修改等。断

点允许程序员停止在某一个特定的程序点以检查当前状态;单步跳过允

许程序员前进到当前断点之后的下一条指令,并且在那条指令设置新的

断点;许多调试器还允许程序员不仅能够查看变量的当前状态,还能改变

它的值然后继续执行。通常地,开发者会在他感觉可能是程序错误位置的

地方设置断点,然后他会检查断点处的状态,他还可以单步跳过程序查看

每一条语句在每一个执行时的状态变化。

主要的定位方法

故障定位技术有很多种,但是根据定位故障的过程中“是否需要运行软件”的准则,可以将故障定位技术分为以下两类:

(1)基于静态分析的故障定位技术(SABFL):静态方法不用运行软件,而是依据程序语言的语法和语义,静态地分析软件结构和程序实体之间的依赖关系,以发现不符合系统约束的程序实体,从而进行故障定位。

(2)基于测试的故障定位技术(TBFL):该方法首先需要设计测试用例,然后运行软件程序,最后根据软件程序的动态执行信息和输出结果进行故障定位。其典型思路是:将程序的失败运行和成功运行进行对比,从而发现失败运行中的哪些点偏离了成功运行,找到的这些偏离点很有可能就是软件故障位置所在。这些不同定位方法都采用了各自不同的运行特征进行对比。

以下是基于测试的故障定位技术:

(一)基于距离度量的故障定位方法:

基本思想是:通过一定的距离计算方法,从众多的成功运行中找出与失败运行最相近的一个成功运行,利用某一种度量方法来计算此成功运行与失败运行之间的差异值,利用得出的最小差异值进行故障定位。该技术大都是在源程序上运行大量的测试用例,并收集程序运行过程中的覆盖信息,利用这些信息来进行故障定位。此方法包括

(1)Delta调试技术

把一次程序执行看做是一系列程序状态的转变(程序状态可以理解为在程序执行某个时刻出现的变量以及这些变量的取值)。程序从初始状态开始执行,每执行一步,程序当前状态就会发生改变,从当前状态转换到下一个程序状态,如此进行,最后到达了个错误的状态,标志着程序执行失败。每一个程序状态都它的前一个状态衍生而来,但是,可能只有一小部分状态与计算下一个状态是相关的,同理,也并不是所有程序状态都与执行失败相关。

Delta调试最重要的步骤就是找出与程序执行失败相关的那些状态,得到一条原因-结果链。比较一次成功执行和一次失败执行的状态序列,它们之间的差别就是一条原因-结果链。采用二分法将原因-结果链上的状态应用到成功的执行路径中,如果运行成功,就表示那一部分代码不存在故障,否则,那部分代码可能是可疑的故障点。经过这样的反复测验,最终可以将可疑故障点缩小到一个非常小的范围。

优点:delta调试完全依赖于对程序状态的研究,而不考虑对程序结构的分析不仅可以找出程序中的错误,还提供了纠错方案。缺点:对于大部分程序而言,一次执行涉及到成千上万个状态,比较程序状态的做法只适用于较小的程序。

(2)“并集模型”:在失败运行的覆盖语句集中查找可疑故障语句。其思想是,从失败运行的覆盖语句集中去掉那些出现在成功运行的覆盖语句集的并集。如果给定一个成功运行的集合S和一个失败运行f,将S中出现的语句覆盖集的并集

-。记为失败运行中出现的语句覆盖集记为该模型的计算公式如式所示: f s (3)“交集模型”:找到能判别这个失败运行的特征,其思想是:从所有成功运行的覆盖.语句集的交集中去掉那些出现在失败运行的覆盖语句集/中的语句,将

-。

得到的差异语句集作为可疑语句集。其计算公式如式所示:S f

缺点:并集模型和交集模型的定位效果不是很理想。因为很多时候故障语句会同时出现在失败运行和成功运行中,当我们对这些语句集合进行集合运算时,故障语句经常会被误删。特别是当大量运行存在的情况下,利用该方法得到的结果集极有可能是空集或者根本就不包含故障语句。

(4)近邻模型

该方法首先选择一个失败运行,然后找到一个与此失败运行的覆盖信息最相近的成功运行。利用失败运行和与其最相近的成功运行,从失败运行的执行语句集中将那些出现在成功执行语句集中的语句剔除,剩余的其他语句集即可作为故障报告。近邻模型提供了两种方法来度量失败运行和成功运行之间覆盖信息的相似程度。一种叫做binary distancing,计算所选择的失败运行与一个特殊的成功运行之间的差异语句集合。该方法可以定义为“失败运行与成功运行执行语句集的不对称距离的基数或者对称距离的基数”。另一种是记录每一个运行所执行到的每一□条语句(或基本块)的执行次数,然后按照执行次数对语句进行排序,计算两个运行得到的有序序列之间的距离,该距离是将其中一个序列转化为另一个序列时所花费的代价。

优点:近邻模型得出的结论是:用近邻模型选择的成功运行通常比随机选择的成功运行更有利于故障定位,而且该模型在定位故障方面比并集和交集模型更好。

缺点:近邻模型通过计算两类运行(成功运行和失败运行)的语句集合之间的距离来寻找与失败运行最相近的成功运行,但是它却无法区分执行了相同语句但是语句执行顺序不一样的运行。

近邻模型的改进:Wang等人在的近邻模型基础上提出了一种新的差异度量方法,即利用程序控制流所对应的两条路径,求解两条路径之间的最小差异作为故障报告。它针对近邻模型不能识别语句执行顺序的不足提出将语句执行顺序作为衡量执行序列相似度的因素之一,将某条语句的一个执行实例看做一个事件,那么每个运行就可以看作是多个事件的执行序列,对失败运行的事件执行序列和

相关文档
最新文档