欢迎来到学术参考网

软件注入故障的跟踪及其响应分析研究

发布时间:2015-12-14 13:50

摘 要:随着计算机应用领域的日益广泛,计算机的可靠性问题越来越关键。为了保证容错机制在应用时能达到预期效果,必须要在系统应用之前对这些容错机制的有效性、可靠性进行验证。基于此,本文将基于PIN对目标程序进行软件注入故障,并进行跟踪及影响分析。

关键词:软件注入;跟踪;影响
引言
  软件故障注入是目前对可靠性系统中可靠性机制评测的有效方法,但是,前提是被测系统必须对实验者开放。在某些保密领域,开放系统是不允许的,这使系统测试变得十分困难。本文提出一种基于Pin的故障注入实验方法,它通过软件方法,在系统中引入智能控制策略,把故障注入到目标系统,进行故障注入实验时由故障注入系统内核代替目标系统内核运行,在不开放系统的情况下,对目标系统的输出状态进行跟踪控制,获得比较好的实验效果。
1故障注入技术概述
  整个故障注入过程是,主控模块选择故障注入对象,并根据注入对象生成所需参数,当需要负载时选择合适负载(可选),然后将上述接口信息传递给目标系统,故障注入模块根据接口信息要求生成相应负载(有可能不需要),根据故障注入对象选择故障注入方法,根据接口信息中的参数信息进行故障注入,将收集到的结果返回给主控模块进行结果分析。在进行故障注入系统的开发过程中,还要明确故障、错误和失效这三个概念及三者的关系。
  故障:定义为由于系统硬件自身的物理缺陷、设计制造的不完善或由于软件设计过程中的疏忽和不合理而致使系统中存在着的潜伏的错误。
  错误:定义为计算过程中由于故障造成的系统信息或状态不正确。
  失效:定义为系统未能正确提供预先指定的服务。
  故障是否会变为错误及错误是否最终导致失效取决于故障类型、发生时刻及其后的系统行为。如图1-1所示,给出了故障、错误和失效三者在系统中的转变过程。

  不同的故障注入技术用于不同的阶段,基于模拟的故障注入被用于设计周期的较早阶段。大多数故障注入工具使用特殊的故障注入技术策略来实现一个特殊系统并且采用一个专门定制的用户界面。
2使用Pin进行故障注入跟踪的流程
  Pin支持Linux的可执行文件的IA-32,Intel(R)64、IA-64的软件架构。Pin主要是指在任意地点插入一个工具允许任意代码(用C语言编写或C++)的可执行程序。当可执行程序在运行时,这个代码的执行是动态添加。
   
2.1目标程序介绍
    使用Pin进行故障注入的目标程序是用C语言开发的基于控制台的绘图程序。该程序采用脏矩形技术实现了一个支持分区域以脏矩形方式更新的画布,并以绘制矩形为实例作为演示。正常运行结果包括一个控制台应用程序,以及一个显示飘动的白色矩形的test窗口。
2.2对目标注入故障
2.2.1随机注入
    首先,使用预处理模块的ELF文件遍历工具,对debugger-shell.H进行遍历,获得各段的属性及地址信息,如下所示:
  include ""debugger-shell.H""
  int main(int argc, char **argv) { if (PIN_Init(argc,argv)) return 1;
  IDEBUGGER_SHELL *shell = CreateDebuggerShell(); DEBUGGER_SHELL_ARGS args; if (!shell->Enable(args)) return 1;
  PIN_StartProgram(); }
    然后,在断点地址列表随机选择一断点地址,设置断点,当程序运行到断点处时,分别在.text,.rdata,.data,.reloc段内随机选择一段内存区域,在这些区域内随机选择一目标位置,向这些位置注入故障。
2.2.2特定变量注入
  (1)编译时注入
  为了在编译期间进行故障注入,必须在程序映像被加载和执行前修改程序指令。这种方法不是将故障注入到目标系统的硬件中,而是通过将错误注入到目标程序源代码或汇编代码中来仿真硬件、软件和瞬时故障的影响。修改后的代码改变了目标程序的指令,以此引发注入。注入产生一个错误的软件映像,当系统执行带有故障的映像时,就会引发故障。
  (2)运行时注入
  在运行期间注入故障,需要有一种触发机制来触发故障注入,常用的触发机制有:第一,超时。这是一种最简单的技术,用一个到达预先设定时间的定时器来触发故障注入。具体来说,超时事件产生一个中断,用来激活故障注入。定时器可以是硬件的,也可以是软件的。
  第二,异常/陷阱。通过硬件异常或软件陷阱来控制故障注入。与超时不同,异常/陷阱可以在某个事件或条件发生的任何时间进行故障注入。例如,将一个软件陷阱插入到目标指令中,它可以在程序执行某条特定指令之前进行故障注入。陷阱执行时,产生一个中断,调用一段中断服务子程序。当硬件检测到某个事件发生时(例如,访问指定的存储器单元),一个硬件异常会引发故障注入。两种机制都必须有对应的中断服务向量。
  $ pin -appdebug -t -- fibonacci 1000
  Application stopped until continued from debugger.
  Start GDB, then issue this command at the (gdb) prompt:
  target remote :33030
3数据回收及影响分析
3.1故障注入跟踪
3.1.1故障的故障静态传播
  在对目标程序进行故障注入前,我们需要对目标程序进行简单配置,具体包括配置目标程序的输入、输出。不断接收来自计算节点的通讯消息,来判断系统中的节点是否到达。若系统中节点j故障,容错服务器将节点j未完成子任务的直接加入任务池中,更新可达节点列表,等待再次的池高度。容错的池调度算法描述如下:
  (1)将用户程序产生的子任务加入任务池
  (2)给每一个节点分配(m/2n)个子任务
  (3)while(任务还未完成){
      If (节点的子任务执行完毕){
     返回计算结果,释放AO;
        }
      Else{
        从任务池中取(s/n)个子任务分配到该节点;
    }
    /*对节点j上的子任务进行容错调度;*/
      If(节点j出故障){
    调整子任务计数器;
    获得不可达节点的子任务相对应的版本;
    将子任务的创建为活动对象
    将创建的活动对象加入到事先定义好的任务池中;将子任务的版本放在最后调度;
    更新新的可达节点列表;
    }
  }
3.1.2故障的故障动态传播
  在动态调度策略下,计算节点具有一定的自适应性,可以根据其它节点的负载情况,实现子任务从过载节点向空载节点迁移,假设系统中节点j出现故障,只 需将故障节点j的子任务重新调度到此时负载最轻的节点上,之后若系统中出现轻载或者空节点,则自动将任务迁移到其它节点上,容错的动态调度算法描述如下:
  (1)收集各计算节点信息;
  (2)根据用户提交的作业信息,生成分配文件;
  (3)根据分配文件,将各子任务分配到对应节点上执行;
  (4)while(任务还未完成){
    if(节点上有子任务执行完毕){
     返回结果,释放AO;
   }
   If(有节点空闲){
   计算平衡时间;
   进行负载平衡,向空闲节点迁移任务;
   }
   else{
   继续执行下一个子任务
   }
  /*对节点j上的子任务进行动态容错调度;
    if(节点j出现故障){
    调整子任务计数器
      获得不可达节点的子任务
      将子任务创建为活动对象
      寻找负载最轻的节点K
      将活动对象迁移到节点K
   }
  }
  收集任务,生成结果。
3.2数据回收
  在适当的时刻进行在线的数据采集回收,采集的数据将来要用于评测系统的容错性能。数据采集器是在控制器的控制下在线采集数据的,不但要采集目标系统无故障运行时的相关数据作为标准数据,还要在目标系统带故障运行时采集其带故障运行数据。
表3-1 目标程序带故障运行结果
运行结果结果描述比例无故障test窗口及输出均运行正常16%错误消息系统弹出错误对话框,提示各种异常现象21%test窗口异常test窗口突然消失,或不出现13%错误输出产生错误输出结果8%崩溃(无输出)系统无输出结果,且超时42%  共对目标程序进行了100次故障注入实验,对其带故障运行结果进行统计,各种现象及所占比例如上表3-1所示。观测表3-1各种运行结果及所占比例,可以发现,系统崩溃的情况占实验总次数接近半数,而无故障也占到将近1/6的比例。将故障注入到代码段致使系统运行不确定指令,或将故障注入到堆栈段,引起资源分配异常,导致崩溃现象。
3.3响应分析
  本文提供了两种故障触发方式:单步触发,时间触发。单步触发即当程序执行指定步数后触发故障注入由run_step()函数实现,在该函数中,对于指定的指令条数,每条指令都执行ptrace(PTRACE_SINGLESTEP,pid,1,lastsig);并且保留单步前的信号lastsig,以继续处理。
  故障注入进程执行wait系统调用,等待目标进程停止在自己的入口处,此时故障注入进程可在目标进程中设置陷阱或其它一些故障触发方式,并恢复目标进程的运行;接着,故障注入进程再执行wait系统调用,等待目标进程的再一次陷入,当故障注入进程被目标进程唤醒以后,就会通过执行一系列系统调用来改变目标进程的执行状态;最后继续等待目标进程执行exit(cause)系统调用(cause是一个程序结束时的返回值),此时目标进程可能崩溃也可能正常退出,随后进行一次上下文切换回到内核。
结论
  因此,故障注入是一种容错计算机系统可靠性评测的有效方法,具有重要的理论和实际意义。总结分析了故障注入的技术方法和故障注入后果分析的基础,总结了发生故障的原因,根据目标程序的实际情况分析了各种故障注入的特点,给出了选择软件实现的理由。本文主要是使用SAVIE进行故障注入,SAVIE的结构主要设计用于运行于分布式系统上,但也可以在单机上运行。
参考文献:
. 贲可荣,张志祥译. 北京:电子工业出版社,2001.

上一篇:浅谈计算机组装与维修技术要领

下一篇:基于单片机的电阻炉模糊控制