嵌入式实时系统中的一些随机软件故障会导致系统的崩溃。这些随机故障通常是由非法的内存访问引起的,包括:
· "CPU饥饿"在内的各种死锁;
· 堆栈溢出;
· 数组越界;
· 内存泄漏。
由于故障的随机性,它们难以复现和检测。
11.2.1 CPU饥饿
程序并行化以后,还会遇到共享数据的访问的问题。
如果多个线程对共享数据都是只读操作,那么对共享数据的访问不需要加锁保护;
如果多个线程对共享数据的访问存在写操作,那么对共享数据的访问必须加锁保护。
在有锁保护的共享数据访问模型中,一旦一个线程取得了锁,那么其他线程在进行锁操作时都必须等待。这样只有一个线程在运行,导致只有一个CPU核在运行,其他CPU核都处于饥饿状态。
解决共享数据访问的最有效方案就是共享资源分布式计算。
传统的调试工具(如主机-代理调试器、JTAG等)在遇到这类问题时有着不可避免的局限性:
· 用户只能看到目标机上的少量内存段;
· 只能用在开发阶段;
· 用户必须在故障发生之前的很长时间内就要决定在哪里停止程序的运行以及要检测哪些信息。
这正是难以定位故障的主要原因。
针对上述问题,RTBF(Real-Time Bug Free)公司提出了具有针对性的SMA(Smart Memory Analyzer)工具。RTBF是世界上首家成功地把嵌入式实时系统的完整内存映像自动转换为可读信息的公司。SMA采用事后分析(post-mortem)技术对由工具在故障发生时"冻结"的内存映像进行分析。原始的内存映像是不可读的二进制数据,经SMA分析后便呈现为具有良好结构和可读性的形式。SMA记录了内存映像被保存时的系统总体状态,包括任务、信号量、消息队列、变量、内存分配、通讯缓冲…。这些信息可以帮助开发工程师定位排查随机故障,系统工程师也由此可以更详细地观察系统状态。而且,SMA创建了快速有效的环形缓冲日志,允许对系统运行时的变量进行跟踪。目前,SMA支持VxWorks.
11.2.2 检测功能
· 适用的处理器包括:x86、arm、MIPS以及Power PC;
· 适用的编译器包括:GNU、DIAB;
· 主机平台:所有版本的Windows;
· 显示包括类型定义、结构、联合、向量和枚举在内的所有变量;
· 显示所有任务的状态;
· 显示看门狗:记录内存映像创建时所有还未被处理的时间相关事件;
· 显示信号量:三种(二进制、互斥、计数)信号量及其状态和拥有者;
· 消息队列:队列号、队列中最大消息数、单条消息的最大容量、空闲消息的数量、收发消息失败的延时;
· 显示所有空闲内存区域、观察分配的内存块、观察内存分配的丢失情况(内存泄漏);
· 显示所有文件描述符和套接字;
· 显示SNMP树;
· 搜集所有错误与警告;
· 显示环形缓冲的状态;
· 显示网络缓冲的状态;
· 计算由任务占据的CPU负载;
· 自动检查大量的常用编程错误,并在需要时给出警告:
· 对复制的声明(不同类型带有相同的名字)给出警告;
· 只读区域在运行中被改写时给出警告;
· 如中断向量表之类的特殊内存区域在运行时如果被偶然改写,也给出警告。
11.2.3主要好处
· 精确定位难以调试的随机软件故障
· 内存映像分析所提供的信息使得开发者可以很轻易地定位到那些即使是比较罕见复杂的软件故障,通常是在它们发生的第一次后就能发现。
· 加速开发过程:
软件故障发生时,SMA为开发者提供了详细可读的系统状态。这些信息帮助开发者在几小时之内就能定位和修正错误,而不是往常那样需要花费几天甚至几周的时间。
· 减少开发投资:
SMA缩短了嵌入式软件开发的周期,也因此减少了开发投资。
· 增加软件可靠性:
通常来讲,使用了SMA,那么故障发生的第一次也是它发生的最后一次。在减少开发投资的同时,也增加了软件的可靠性。
· 软件工程过程的新视角:
SMA详细、准确、可读地描述了系统状态,它为系统工程师提供了新的视角,使其在看待系统整体时不会漏失具体细节。
分析与故障发生的位置和时间无关。
作者:顾翔
来源:51Testing软件测试网原创