一种软件运行时故障定位方法与流程

文档序号:12463997阅读:267来源:国知局
一种软件运行时故障定位方法与流程

本发明涉及软件系统可靠性研究技术领域,特别涉及一种软件运行时故障定位方法,用于对软件系统进行运行时监控,实现软件系统的故障定位。



背景技术:

当今社会,计算机软件系统的使用已经深入到社会生活的方方面面,比如到通信系统、航空航天器、武器装备、金融与贸易平台、指挥控制系统等等,处于社会发展的核心地位。随着软件需求的复杂化程度增大,软件系统本身的复杂程度也变得日趋庞大,这样就造成软件系统发生故障和失效的可能性增大。一旦核心软件系统发生失效,会对国民经济、人民安危甚至国家安全造成极大的损失。因此,对软件系统的故障进行准确定位和诊断的需求也变得愈加迫切。软件系统的故障定位是调试系统、修复系统中最复杂、耗时最长的一项内容。

目前,各国学者研究出了一些软件系统自动化故障定位方法,这些方法主要分静态方法和动态方法。静态方法利用系统中程序的依赖关系、类型约束等信息来分析程序中的可能故障点;动态方法则通过测试系统程序,跟踪系统程序的执行轨迹和覆盖信息来进行故障定位。高效地定位软件故障为软件的自修复、自适应提供了前提和保障。这些方法虽然在一定程度上解决了故障定位的问题,但效果都不是很理想,同时现有方法很少结合软件运行时状态信息,很难做到软件运行时故障定位。因此,如何尽可能准确的利用软件运行时状态变化定位软件故障位置,成为近几年研究的热点。



技术实现要素:

本发明的目的在于克服现有技术的不足,提供了一种软件运行时故障定位方法,该方法简单易实现、适用范围广、可靠性强、故障定位准确率高,可以有效保障软件系统的可信性。

本发明的上述目的通过以下方案实现:

一种软件运行时故障定位方法,包括以下步骤:

(1)、采用规约定义语言将设定的软件系统测试需求定义为性质规约;

(2)、对性质规约对应的脚本文件进行编译得到事件识别器,并确定所述事件识别器的插装位置;然后在软件系统程序进行编译之前,通过代码插装工具将所述事件识别器对应的代码插装在软件系统程序中;

(3)、根据性质规约确定软件系统对应的LTL公式,并利用自动机理论将所述LTL公式转化为有穷状态机,作为运行时监控器;

(4)、根据性质规约确定软件系统的关键变量和关键函数,将所述关键变量和关键函数所在位置作为检测节点,并在所述检测节点上部署探针;

(5)、在软件系统运行时:事件识别器采集设定的监控变量的变化数据,并发送给运行时监控器;运行时监控器对监控变量的变化数据进行验证,判断软件系统执行情况是否符合性质规约;探针记录软件系统的执行路径;

(6)、重复步骤(5),将软件系统运行M次,得到M组验证结果和软件系统执行路径;

(7)、根据M组验证结果和软件系统执行路径,统计每个检测节点上出现故障的次数,选取故障次数最高的若干个位置作为软件系统的故障点。

上述的软件运行时故障定位方法,在步骤(1)中,采用原子事件定义语言PDEL和复合事件定义语言MEDL描述设定的软件系统测试需求,确定性质规约。

上述的软件运行时故障定位方法,在步骤(5)中,运行时监控器对监控变量的变化数据进行验证,判断软件系统执行情况是否符合性质规约,其中:如果运行监控器判断软件系统执行情况符合性质规约,则输出验证结果为0;如果运行监控器判断软件系统执行情况不符合性质规约,则输出验证结果为1;如果运行监控器不能确定软件系统执行情况是否符合性质规约,则设定验证结果无效。

上述的软件运行时故障定位方法,在步骤(5)中,探针记录软件系统的执行路径,具体实现方法如下:在软件系统执行过程时,如果对探针对应的关键变量或关键函数进行了操作,则所述探针输出结果为1;在软件系统执行完成后,将N个探针值构成的矢量作为软件系统的执行路径;N为软件系统中部署的探针总数。

上述的软件运行时故障定位方法,在步骤(7)中,软件系统的故障点具体定位实现过程如下:

(7a)、在M组验证结果中提取M′组有效验证结果,即所述M′组有效验证结果对应的软件系统执行路径;M′为验证结果有效的软件执行次数;

(7b)根据M′组有效验证结果和软件系统执行路径,得到软件故障分析矩阵Q:

其中:ei为第i个有效验证结果,如果运行监控器判断软件系统执行情况符合性质规约,则ei=0,如果运行监控器判断软件系统执行情况不符合性质规约,则ei=1;Xi=[xi1xi2 … xij … xiN]T为第i个有效验证结果对应的软件系统执行路径,如果软件执行过程中经过第j个检测节点,则xij=1;i=1、2、…、M′,j=1、2、…、N,N为软件系统中部署的探针总数;

(7c)根据软件故障分析矩阵Q,统计软件系统执行过程中经过各检测节点时出现软件故障的次数,具体计算公式如下:

其中,αj为软件系统经过第j个检测节点时出现软件故障的次数;

(7d)对α1、α2、…、αN按升序进行排序,选取排序后的前L个值对应的检测点作为软件故障点。

本发明与现有技术相比,具有以下优点:

(1)传统的故障定位方法大都基于对静态程序的分析,本发明在现有方法的基础上,提出了软件运行时故障定位方法,在软件运行环境中监控和记录软件运行过程,分析软件在各种运行环境中的执行状态和结果,进行运行时验证,并基于运行时验证结果进行故障定位,该方法故障定位准确,在很大程度上降低了故障定位错误率;

(2)本发明基于线性时序逻辑(LTL)和自动机理论构造构造监控器,通过减少自动机生成状态数的方式减小了最终监控器的规模,降低了方法实现的复杂度;

(3)本发明通过对软件运行时的行为信息进行监测,利用时序逻辑和自动机理论实现对软件行为运行时刻的验证及分析,因为只关注软件当前的运行行为,并不用考虑软件所有可能的运行情况,因而不会出现类似模型检测的状态爆炸问题,可操作性强;

(4)本发明通过部署的软件运行时监控器和软件探针,判定软件故障是否暴露,并记录每次运行路径经过的程序位置,通过统计分析的方法,结合运行时验证的结果,进行软件故障的定位,在很大程度上提高了软件系统故障的准确率。

附图说明

图1为本发明的软件运行时故障定位方法处理流程图;

图2为为LTL公式到交错的Büchi自动机转换流程图。

具体实施方式

下面结合附图和具体实例对本发明作进一步详细的描述:

本发明采用运行时验证技术对软件系统进行故障定位,该技术是一种轻量级的程序验证技术。本发明的验证目标是检测软件系统的实际运行是否违背了设定的性质规约。其中,采用线性时序逻辑(Linear Temporal Logic)公式描述设定的性质规约,并以此为基础生成相应的监控器。通常从系统需求中产生监控器,监控器通过观测程序的执行来检查程序运行过程是否满足系统需求。因此,在运行时验证中,监控器可以定义为“读取有穷运行路径并给出相应结论的装置”。与模型检验相比,运行时验证中的监控器生成过程与基于自动机理论的模型检验方法中性质自动机生成过程类似,但运行时验证不需要考虑系统的所有状态空间与所有可能运行路径,因此避免了状态爆炸问题;与测试相比,运行时验证有些类似于基于预言的测试(Oracle-based Testing),即监控器接近于测试预言(Test Oracle),但运行时验证不需要考虑测试充分性和覆盖率等问题。运行时验证技术不但可以有效的检测系统运行中的异常行为,而且也使得在检测到正确性背离时有效地修复系统成为可能。另外,本发明采用了在线监控的方式对软件系统进行监控,以一种递进的方式来检查软件系统运行情况,不需要记录和保存系统的历史执行轨迹,可以为故障定位提供支撑。

本发明的软件运行时故障定位法,主要包括静态准备阶段、动态运行阶段和故障定位阶段,具体实现过程如图1所示。

(一)、静态准备阶段

在静态准备阶段,即在软件系统运行之前,根据软件系统的高层需求描述,确定性质规约,然后根据该性质规约在软件系统中插装代码、部署探针,并构造运行时监控器。

(1)、定义性质规约

在面向软件系统的运行时验证方法框架中,事件和条件分为了原子事件和条件、复合事件和条件两种。原子事件和条件由目标系统中的变量、方法抽象而来,而复合的事件和条件则与目标系统中的变量、方法没有直接的联系,是由原子事件和条件组合而成。因此本发明采用原子事件定义语言PDEL和复合事件定义语言MEDL将设定的软件系统测试需求定义为性质规约,具体定义过程如下:首先使用底层的原子事件定义语言PDEL对被测试软件系统中的关键属性和由这些属性组成的基本事件和条件进行描述,得到PDEL规约;然后使用高层的复合事件定义语言MEDL对由基本事件和条件组成的复合的事件和条件进行描述,得到MEDL规约;并定义待验证的LTL性质规约,从而将软件系统的高层测试需求和底层执行信息联系起来。

(2)、插装代码

对PEDL规约和MEDL规约进行编译,得到可以采集软件系统运行时状态信息的事件识别器,以及该事件识别器的插装位置;然后在软件系统程序进行编译之前,通过代码插装工具将事件识别器对应的代码插装在软件系统程序中,即在软件系统程序中指定语句和关键代码片段前插入状态采集指令,用于在软件系统执行时采集待监控变量的变化数据。

(3)、构造运行时监控器

根据性质规约确定软件系统对应的LTL公式,并利用自动机理论将所述LTL公式转化为有穷状态机,作为运行时监控器,具体构造步骤如下:

(3a)、将LTL公式转换成非确定Büchi自动机

用交错Büchi为中间环节,首先将LTL公式经由正确性检测、形成语法树、生成并化简ABA等步骤转换为交错的Büchi自动机(ABA)流程如图2所示;然后将ABA转换成非确定的广义Büchi自动机(NGBA)GA=(Q',∑,δ',I,Γ);最后,将NGBA按照下面的规则1转化成一个与其等价的非确定Büchi自动机(NBA)BG=(Q×{0,...,r},∑,δ',I×{0},Q×{r}):

规则1:δ'((q,j))={(α,(q',j'))|(α,q')∈δ(q))且j'=next(j,(q,α,q'))},其中next函数的定义如下:

经上述过程,即可将NGBA最终转化成NBA。

(3b)、对非确定Büchi自动机进行判空、有穷化等优化操作,构造出有穷状态自动机NFA

首先,利用最大强连通图优化NBA,通过算法找到自动机中全部强连通图,将其标记为“不可监控”,并将所有标记“不可监控”的状态从状态集合中删除。然后,进行判空优化操作,对于自动机中的每一个状态q,判断该自动机从q开始能接收的语言是否为空,通过遍历自动机,对每个状态进行判空操作,将判空为真的状态标记为“冗余”,并将标记为“冗余”的状态删除,达到优化自动机的目的。最后,由NBA构造非确定有穷状态自动机NFA,使构造的监控器只接收有穷字,可以根据有穷轨迹,进行规约的验证。

(3c)、将非确定有穷状态机进行确定化,得到确定化的有穷自动机

给定一个非确定有穷自动机NFA按照以下规则2将其转化成与其等价的确定化有穷自动机DFA其中,规则2为:

Q'=2Q

其中S∈Q

I'=I

经过上述确定化过程即可得到确定化有穷自动机;

(3d)在确定化有穷自动机的基础上,将两个自动机和进行笛卡尔乘积,在自动机每个状态处标记额外的输出符号,即可得到有穷状态机FSM,将其作为运行时监控器,可以实现对软件系统的执行轨迹做出给定性质是否违背性质规约的判定。

(4)、部署探针

根据性质规约确定软件系统的关键变量和关键函数,将所述关键变量和关键函数所在位置作为检测节点,并在所述检测节点上部署探针。这些探针用于记录软件系统的执行路径。

(二)、动态运行阶段

在动态运行阶段,即在软件运行的过程中,插装代码采集软件系统运行时设定监控变量的变化信息,监控器根据该变化信息进行性质规约执行情况验证,探针记录软件系统的执行路径。

运行时验证:事件识别器采集设定的监控变量的变化数据,并发送给运行时监控器,运行时监控器对监控变量的变化数据进行验证,判断软件系统执行情况是否符合性质规约;其中:如果运行监控器判断软件系统执行情况符合性质规约,则输出验证结果为0;如果运行监控器判断软件系统执行情况不符合性质规约,则输出验证结果为1;如果运行监控器不能确定软件系统执行情况是否符合性质规约,则设定验证结果无效。

探针记录软件系统的执行路径,具体实现方法如下:在软件系统执行过程时,如果对探针对应的关键变量或关键函数进行了操作,则所述探针输出结果为1;在软件系统执行完成后,将N个探针值构成的矢量作为软件系统的执行路径;N为软件系统中部署的探针总数。

在该阶段,将软件系统运行M次,得到M组验证结果和软件系统执行路径。

(三)、故障定位行阶段

在故障定位阶段,根据软件执行路径和监控器验证结果,进行统计分析实现软件系统故障定位,具体定位实现过程如下:

(a)、在M组验证结果中提取M′组有效验证结果,即所述M′组有效验证结果对应的软件系统执行路径;M′为验证结果有效的软件执行次数;

(b)根据M′组有效验证结果和软件系统执行路径,得到软件故障分析矩阵Q:

其中:ei为第i个有效验证结果,如果运行监控器判断软件系统执行情况符合性质规约,则ei=0,如果运行监控器判断软件系统执行情况不符合性质规约,则ei=1;Xi=[xi1xi2 … xij … xiN]T为第i个有效验证结果对应的软件系统执行路径,如果软件执行过程中经过第j个检测节点,则xij=1;i=1、2、…、M′,j=1、2、…、N,N为软件系统中部署的探针总数;

(c)根据软件故障分析矩阵Q,统计软件系统执行过程中经过各检测节点时出现软件故障的次数,具体计算公式如下:

其中,αj为软件系统经过第j个检测节点时出现软件故障的次数;

(d)对α1、α2、…、αN按升序进行排序,选取排序后的前L个值对应的检测点作为软件故障点。

以上所述,仅为本发明一个具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

本发明说明书中未作详细描述的内容属于本领域专业技术人员的公知技术。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1