一种面向方面的软件容错能力增强工具
- 格式:pdf
- 大小:411.34 KB
- 文档页数:4
第29卷第2期 2012年2月 计算机应用与软件
Computer Applications and Software Vo1.29 NO.2 Feb.20l2
一
种面向方面的软件容错能力增强工具
黄焱艺 于 阳 彭 鑫赵文耘
(复旦大学计算机科学技术学院上海200433)
摘 要 容错是保障软件可靠性的重要手段。该目标是利用对软件系统静态分析的信息,生成具有客错能力的方面文件来增强
软件系统的容错能力。首先利用抽象语法树的分析工具,来获得一些有用信息,比如异常类型和抛出异常的方法。然后通过模板生
成工具生成相应的恢复代码,利用面向方面机制,将代码动态编织入系统中。最后做一个案例证明方法在实现容错增强方面的可
行性。
关键词 软件容错
中图分类号TP317 面向方面 工具 文献标识码A
AN ASPECT.oRIENTED SoFTWARE FAULT ToLERANCE ENHANCEMENT TOoL
Huang Yanyi Yu Yang Peng Xin Zhao Wenyun
(School ofComputer Science,Fudan Un#e ̄ity,Shanghai 200433,China)
Abstract Fault tolerance is an important means to assure software reliability.The goal of this paper is to use the infommtion of static
analysis on software system to form the aspect file with fault tolerance capability for enhancing the fault tolerance capability of software system.
We first use the analysis tool of abstract syntax tree to get some useful information,such as the type of exception and the method of exception
throwing.Then we use template generation tool to generate corresponding recovery code,and use aspect—oriented mechanism to weave the
code into the system dynamically.Finally,we make a case to prove the feasibility of the method in realising fault tolerance enhancement.
Keywords Fault.・tolerance of software Aspect・-oriented Tool
0 引 言
软件系统正越来越多的应用到生活的方方面面,但是开发
一
个没有缺陷的软件系统通常是非常困难的,因此软件有时会
失效,失效的后果可能只是造成一些不方便(比如电视机遥控
器不能用),也可能是灾难性的(比如商业飞机上的软件故
障)…。为了使软件系统在出现失效时能够继续运行,提出了
容错技术,容错是保障软件可靠性的重要方式。文献[2]讲述
了一些当前的容错技术,包括恢复块,N版本编程等。异常处理
是构建高可靠性容错系统的一个重要方面。异常处理最早是由
John Goodenough在1975年在文献[3]中提出来的。现在异常
通常都被定义为在程序执行过程中影响程序正确行为的特殊事
件。程序语言的设计者经常忽略异常机制,这就让开发异常处
理代码的开发者觉得开发一个好的异常处理代码是困难的,容
易出错的,而且效率不高。并且,对异常处理不完美的程序来
说,当程序出现异常,系统就会停止运行,极大影响了程序可靠
性和用户体验,所以异常处理在高可靠系统的实现中有着重要
的作用。
本文给出一个工具,该工具通过对抽象语法树静态分析的
信息来定位异常和判定异常信息,由此选择异常恢复策略,结合
AOP技术,工具实现自动生成异常捕获代码,生成AspeetJ程序
模板,并且通过分析代码定义了常见异常的通用处理模式,同时
支持用户自定义异常处理方式。
1背景介绍
Java的异常处理机制包含三部分:Throws说明可能抛出的
异常,调用该方法必须处理这些事件;将可能抛出异常的代码放
在try块中,处理放在catch块中,finally用于恢复系统状态;
Throw后面跟异常对象类型,说明抛出的异常。对于Java异常
可分为检查异常和未检查异常。本文主要处理检查异常。文献
[4]中研究表明,程序员并不常书写代码处理异常,更多时候是
采取忽略或者简单返回一个缺省值并终止程序的方式来处理,
而不是真正的去规划恢复策略,书写恢复代码。而很多时候对
异常恢复策略的规划是有意义的。由于异常处理可能引发的控
制流复杂性和异常本身的复杂性,比如即使是同一个异常,处理
策略也经常是各不相同的,这就给异常处理策略的规划增加了
难度。
由于异常分布的散乱性,直接在系统中书写异常代码会和
已有代码交缠在一起,因而在异常处理中引入面向方面的思想
是有意义的。面向方面的编程是面向对象编程的有效补充,提
供了新的语言特性来增强模块化和分离关注点,可以以非侵入
方式改变程序的执行方式,极大地降低了异常处理代码和原代
收稿13期:2011—05一O7。国家自然科学基金(90818009)。黄焱
艺,硕士,主研领域:软件容错自适当。
10 计算机应用与软件 2012血
码的耦合性 J。但是面向方面能否增加系统的模块化仍然是
一
个值得探讨的问题。文献[6]中指出,如果异常处理代码很
大程度上是上下文相关的,那么使用面向方面技术带来的好处
就有限,但是如果能事先规划好,面向方面会是一个很好的补
充。所以本文通过工具提供了自动的代码生成,同时也提供了
一
定的灵活性,与上下文相关的内容,我们允许开发者自己定
义。通过自定义的代码生成工具生成方面文件,对已有的程序
进行打补丁式的补充,增强了程序的异常处理和容错能力。
2工具介绍
为了实现容错处理,就必须能先对异常定位并分析异常,并
给出相应的恢复策略,我们开发了一个工具。这个工具结合抽
象语法树静态分析的信息生成恢复策略,然后自动生成Aspec ̄
文件,实现异常的修复,达到容错效果。
2.1工具框架介绍
工具的运行过程主要包含两个部分。第一部分,利用抽象
语法树来获取异常所在的方法位置信息、方法参数和方法返回
类型等信息。第二部分,是一个自动生成方面文件的工具。工
具从抽象语法树分析工具分析的结果出发,对异常和异常所在
的方法进行分析,利用string template工具,把抽象语法树中的
分析得到的信息设置到要生成的方面文件中,对每个异常生成
一
个默认的方面文件。方面文件动态切入源代码中实现了默认
的异常恢复策略,由于默认异常恢复策略不能保证对所有的异
常处理都有正确的效果,所以工具也允许用户自定制异常恢复
策略,更加灵活和个性化。
2.2抽象语法树分析工具
抽象语法树SAT(Abstract Syntax Tree)是源代码经过词法
分析和语法分析得到的产物,作为程序的一种中间表示形式,能
够包含编译单元的完整表示,可以比较直观地展示整个程序的
语法结构,语法树的建立是在词法分析、语法分析、语义分析的
过程中逐渐产生的。其中词法分析对源程序进行分析,并形成
符号表,作为下一步语法分析做准备,接着语法分析初步形成具
有相应语法结构的中间节点的抽象语法树。最后语义分析,把
名字和操作符进一步处理,产生具有表示类型信息的对象和符
号表的标准的抽象语法树。这时语法树就是完整的抽象语法树
了,它包含了程序结构的基本信息。如图1所示。
图1 int p=0;while(k>0)ll抽象语法树结构
抽象语法树在程序分析和程序开发等诸多领域有广泛的应
用,比如经常用来做代码克隆检测、程序数据流,控制流的分
析等。
为了定位异常产生的位置和异常所在方法和其他方法的调
用关系,这里使用抽象语法树的分析工具来得到程序结构的基
本信息。该工具是一个Eclipse插件,用来做静态代码结构分
析,使用工具可以得到代码中异常的种类,异常所在的类,异常
所在的方法和异常是被catch还是被throw,工具如图2所示。
:
…毒 印 _一_ _一…”_ 竺 曼 。 冉 舷
i i 舯酗 r■■_ -__’
图2抽象语法树代码分析工具
通过该工具可以分析出每个类的方法、参数,抛出的异常以
及每个类之间方法的调用关系,这些信息对于后面生成方面文
件是必不可少的。抽象语法树工具是对源码的静态分析,但是
由于运行时的上下文信息是比较难以获取的,所以我们这里只
对代码做静态分析。根据静态分析得到的信息生成异常处理代
码,正如文献[7]提出的指导原则之一,异常处理必须提供上下
文信息,这里开发者可以利用工具进行进一步的自定制来获取
上下文信息,实现相应的恢复。
2.3设置工具描述
我们开发了一个设置工具,工具中定义了处理异常的面向
方面文件模板,根据模板,利用模板生成工具String Template生
成用于对当前系统做异常处理的方面文件。图3是工具的一个
使用界面。
图3设置工具
首先,选择一个已经用抽象语法树分析过的项目,比如图3
的jforum;然后,由于异常经常是分散在程序中的不同位置,因
此对于抽象语法树分析的结果,我们按照异常的类型来进行分
类,因为同一类型的异常处理方法总是相对于不同类型异常的
处理方法要相似的多;当在ExceptionSetting框中选中特定异常
类型后,抛出这个异常的所有方法,都在第三个框中列出来。包
括类名、方法名、方法参数类型和返回类型。这些信息是生成面
向方面文件的必要信息。
2.4策略的描述
文献[8]提出了一个面向方面的框架来支持Web服务的监
控和恢复,主要是致力于Web服务的运行时监控,以及根据监
控信息来合成Web服务。在恢复的时候,提到三个通用的恢复
策略分别是重试、忽略、可选,但是对于通用策略的代码自动生
成仍然没有做,我们文章试图在通用策略的自动代码生成上做
些尝试。通用恢复策略如图4所示。一般来说,如果重试不成
功,可以忽略(skip)当前异常,或者选用其他可选的方式再重新
尝试,也就是上文所说的可选(alternative)。
对于异常类型和策略的对应关系是一种多对多的关系,同
样是使用的retry策略,但是处理的可能是两种不同的异常。比
如IOException的产生可能是由于远程资源访问不到,而SQLEx.
ception可能是数据库的访问出现问题,截然不同的两种异常,