找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

[嵌入式/ARM] 基于软件故障注入的嵌入式系统鲁棒性测试

[复制链接]
admin 发表于 2013-3-24 11:02:21 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
摘  要: 以研究对嵌入式系统鲁棒性进行评价和基于软件故障注入技术的嵌入式系统鲁棒性测试为目的。对嵌入式系统鲁棒性测试的相关概念以及软件故障注入技术原理进行了介绍,以Linux操作系统内核函数测试为例,通过对系统API参数的故障注入接口进行分析,提出基于GDB工具的软件故障注入方法来实现系统鲁棒性故障注入测试。完成了相应的Linux操作系统API接口故障注入测试实例并给出了测试结果。为嵌入式系统鲁棒性测试提供了更为直观、有效的方法。
关键词: 鲁棒性; 故障注入; 软件测试; 嵌入式系统
       嵌入式系统由于其自身的特点,在开发和测试方面的难度往往大于通用软件。传统的结构化测试方法在测试系统鲁棒性方面存在一些缺点[1]。故障注入方法作为传统测试方法的一种补充,重点测试系统在异常条件和无效参数下容错应对情况。通过注入故障的方法来测评容错机制、验证系统异常应对能力,从而提高系统鲁棒性。其最大的特点是高度灵活性,它既能通过特殊的硬件辅助设备进行硬件方法的测试,也能实现软件方法的故障注入测试。
     在嵌入式系统软件测试方面,故障注入技术可以对系统的容错性、可靠性、安全性进行测试,既可以采用静态故障注入的方式,也可以采用动态故障注入的方式。本文针对嵌入式系统的结构特点和可靠性设计,利用嵌入式系统API,在OS接口以及应用层实现软件故障注入,构建软件故障注入模型。通过对注入故障后系统反馈数据的分析,可实现测试和评估容错机制的目标,从而达到提高系统鲁棒性的目的。
1 嵌入式系统鲁棒性测试简介
     系统鲁棒性是衡量系统在压力环境或异常输入下保持正常工作能力的一种度量[2]。嵌入式系统体系结构从底层到顶部的顺序依次是:内核(包含内核函数)、系统调用、内建程序(操作系统的命令)[3]。内核函数是内核代码的组成部分,其调用程序直接运行在内核空间。内核函数一旦出现异常,将立刻对整个操作系统产生影响。实施嵌入式系统鲁棒性测试的主要目的就是发现系统内核的薄弱环节,并予以消除或增强抵抗异常情况的能力,从而提高系统的鲁棒性。
     传统的系统鲁棒性测试方法是通过观察系统的失效行为,通过分析错误记录来完成的。对一个高可靠系统而言,通过长时间实际观察来获取有关统计结果不切实际。嵌入式系统鲁棒性测试关心的是系统失效的情况,对于嵌入式系统鲁棒性的评价一般有基于测量的方法和基于故障注入的方法[4]。测试的重点在于通过在内核层面进行故障注入,人为地使系统出现故障,进而对故障信息进行分析,最终根据测试结果生成相应的保护代码。
2 软件故障注入技术概述
      故障注入技术就是按照选定的故障模型,用人工注入的方法有意识地产生故障并施加于运行的目标系统中,达到加速该系统错误和失效的产生,通过监控并采集系统对注入故障的反馈信息和现场数据,通过分析提供有关结果的测试过程[5]。一般故障注入流程如图1所示。
    20121107050859439124702.gif
       软件故障注入技术是通过特定的程序对系统软件、硬件错误状态进行仿真。这种方法容易测试出新的故障类型。故障注入原理就是通过修改程序执行语句,增加、修改、删除数据或直接修改寄存器或存储器的内容来模拟硬件或软件故障的发生。软件故障注入的目标可以是应用程序或操作系统。如果目标为应用程序,故障注入程序插入到应用程序中或作为应用程序和操作系统之间的一层。如果目标是操作系统,注入程序只能嵌入到操作系统中。
     软件实现的故障注入技术有以下三种:
     (1) 修改程序的源代码使其出现故障,通常用于变异测试;
     (2) 在执行过程中修改程序某部分的数据状态,通常用于故障行为研究;
     (3) 基于压力的故障注入。即通过一定的工作负载来触发系统容错行为,验证系统容错机制。
         软件实现的故障注入投入低且易于控制,无需额外的硬件设备,可以在程序指令能够访问到的软硬件位置上自由选择故障注入点。作为近年来新兴实验技术手段,软件的故障注入方法有着成本低、灵活度高、可再现性等优点而被广泛采用。
3 嵌入式系统故障注入方法
     嵌入式系统中用户层与内核的交互都需要通过系统接口API来实现,所以对系统内核的故障注入需要针对这些系统调用接口进行[6]。可采用嵌入式系统中的常用工具GDB进行。GDB的全称是GNU Debuger,是GNU开源组织发布的一个强大的UNIX下的程序调试工具。使用GDB工具可以让被调试程序停止在任意一个位置。在程序停止时,可查看或修改程序内存空间或寄存器的值。GDB的功能可用于对被测试程序进行故障注入,设置断点进行故障触发,修改内存和寄存器的值来进行故障数据注入,查看内存和寄存器的值来回收故障数据等。
     Ptrace()是GDB的基础调试工具,通过Ptrace()可以在一个进程中观察和控制另一个进程的执行状态,主要用于执行断点调试和系统调用跟踪。在嵌入式系统下,可使用Ptrace()系统调用来进行故障注入和故障数据采集。Ptrace()的系统调用格式如下:
     #include <sys/ptrace.h>
      Long ptrace(enum_ptrace_request request, pid_t pid, void *addr, void *data)
     参数pid表示进程号,request表示具体操作,data表示要注入的数据,addr指明地址。在进行具体的故障注入时,需要控制运行的进程,并对进程的上下文进行读写操作。通过ptrace()调用可以对进程间通信进行跟踪,使得一个进程可动态地读写另一个进程的内存和寄存器值,包括代码段、数据段和堆栈段,以及访问和修改通用寄存器和专用寄存器[7]。其故障注入原理为利用ptrace()调用追踪应用进程,对应用进程中的系统调用服务注入故障,并由ptrace()监控应用进程故障注入结果[8]。
     故障注入程序运行时,父进程执行fork()生成子进程,子进程执行系统调用ptrace(),使该子进程处于被追踪的状态,程序同时开辟共享内存空间并定义一个全局的故障存储数据结构,父子进程间通过信号量互斥的方法使用共享内存传送数据。父进程将request、addr和data拷贝到该数据结构后唤醒子进程并使其进入就绪状态,然后进入睡眠直到子进程响应。当子进程继续运行时,执行适当的跟踪命令,把子进程的回答写到故障存储数据结构中去,然后唤醒父进程。根据故障注入程序设计的不同,可释放子进程,也可使子进程挂起并等待新的命令,以便再次进入被追踪状态执行故障测试项。当故障注入程序继续执行时,父进程调用ptrace()追踪测试项,将子进程提供的返回值保存起来,对故障值与参考值进行比较,如果不符即表示存在容错机制未覆盖的故障,然后将故障存储数据结构有效值返回给用户。图2是利用ptrace()实现的故障注入方法流程图。
    20121107050859501624703.gif
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-26 02:11 , Processed in 0.056392 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表