嵌入式软件中错误的自动重现与分析
1. 理论与算法
在嵌入式软件中,错误的自动重现和分析是一个重要的研究领域。我们的方法主要考虑了两种非确定性输入源:传感器输入和线程调度,而不考虑内存违规问题,因为许多可用的内存分析工具可以轻松检测到这类错误。
1.1 传感器访问的记录与重放
嵌入式软件常常由定时器或中断触发对连接设备的访问,以特定频率请求设备状态。例如,导航软件可能以 10Hz 的频率访问 GPS 传感器。
- 记录过程 :在软件执行到设备访问完成的位置(定义为 Receive)时暂停执行,将读取的数据写入日志文件。
- 重放过程 :在中断开始访问设备的位置(定义为 Request)暂停执行,跳过对传感器的访问,跳转到 Receive 位置,从日志文件中读取数据并注入到执行中。
这个过程可以使用调试器工具实现,调试器基于的重放过程可以通过序列图进行说明。
1.2 线程调度的记录与重放
线程调度也是非确定性的一个来源。线程调度的记录与重放基于线程事件和 IO 事件序列的重建。在重放时,触发相同的事件调用序列。
例如,在行人识别软件组件中有两个线程:用于识别图片中行人的 Proc 线程和用于在检测到行人的图片中绘制矩形的 GUI 线程。当两个线程交替执行时,不会出现故障;但当 Proc 线程执行两次时,会出现图片未绘制的问题。
我们的方法实现了活动线程的序列化和在线程操作时随机切换线程。正常的线程调度器被锁定,任何时候只有一个线程处于活动