2015年8月5日 西米奇

故障注入重新访问-与视频

由雅各布Engblom

jakob-engblom-intro-picture

故障注入是一个非常强大的功能西米奇和一般的模拟。西米奇5引入了一个新的框架,使创建支持记录、重放、可重复性和反向调试的故障注入器变得更容易,并使用户更容易发现并将故障注入器应用到他们的系统。这篇博客文章更详细地介绍了它是如何工作的,以及可以使用故障注入和Simics做些什么。请查看附带的视频西米奇5运行中的故障注入。

新的错误注入框架的目的是标准化错误注入器的编写方式、如何将它们附加到系统,以及如何启用和禁用实际的错误。以前,错误通常是通过命令行脚本和Python的混合实现的,以特定于每种情况的特殊方式实现。每个错误注入器都有自己独特的用户界面,不可能列出特定Simics安装中可用的所有错误注入器。在新的框架中,故障注入器应该更加规则,并且统一地支持一些特性,比如记录注入的故障以便精确回放。

故障注入是一个宽泛的术语,但通常它意味着以超出预期操作的方式更改硬件设置或存储或读取值。我们期望错误会导致软件检测到问题并以某种方式处理它——或者软件做一些完全不受控制的事情,因为它没有为问题中的错误做好准备。一个令人遗憾的事实是,错误处理代码通常是系统中测试最少的部分,但当事情真的变坏时,它也是系统中必须介入的部分。因此,我们所能做的任何改进错误处理代码的测试都有利于产品质量和最终用户。

下面是一些典型的故障和故障处理示例,以及如何模拟它们。

  • 宇宙射线在内存中诱发位翻转,内存控制器ECC(纠错码)功能检测到错误已经发生。如果我们假设错误是不可纠正的,硬件中的ECC函数将在ECC寄存器中设置一些标志和值,并在处理器上触发一个中断。然后处理器将跳转到ECC错误处理程序,该处理程序将读取硬件寄存器以确定故障的性质,然后采取一些适当的操作——重新启动系统,记录错误,从一些辅助内存中恢复,等等。在Simics中模拟这个问题是将正确的错误报告值放入ECC寄存器,并触发中断。在Simics抽象级别上,没有必要对翻转的实际位和ECC校验和进行建模。
  • 机架中的一个板由于坏的软件驱动程序和来自网络的意外输入而崩溃。最终,系统的其他部分会注意到这块板已经离线,因为它停止广播它的心跳消息。根据恢复设计,由另一块板接替第一块板的角色,系统进行恢复。在Simics中测试这一点很简单,只需停止故障板上的所有处理器或断开它与背板网络的连接。
  • 一个物联网传感器节点醒来采集样本,并试图发送它,但附近的一个微波炉是激活的,噪音阻止了所有发送尝试。该软件注意到目前的情况似乎没有希望,并等待一分钟后试图重新传输。在Simics中模拟这种类型的场景很简单,只需停止节点的所有发送包,并配置无线网卡模型,以告诉软件无线电环境充满了噪音。看到“物联网自动测试-使用模拟获取更多Simics的物联网模拟信息。
  • 由电子控制系统控制的汽车发动机会发生物理故障,性能迅速下降。控制软件检测到的变化行为,试图控制律补偿,但这未能纠正的情况时,错误处理代码调用关闭发动机一个假定的失败安全模式,并立即通知车的主人要求援助,让车车库。在模拟中,通过向发动机控制系统输入一系列与故障对应的传感器读数,可以很容易地模拟出这种情况。看到“仿真的三位一体获取更多关于Simics与物理模拟器集成的信息。
  • 恶意的畸形TCP/IP报文被发送到嵌入式Linux系统,导致网络堆栈崩溃。对于堆栈中那些特定类型的坏数据包没有适当的处理方法,现在已经证明了这一点。在Simics中对此进行测试就像从一个模糊器或其他错误数据来源发送数据包流一样简单。记录发送的数据包的顺序对于重现错误是至关重要的。

在所有这些情况下,能够精确地重播和特定的故障场景是非常重要的,这样就可以调查故障处理代码的任何失败。能够重播错误还可以将错误注入作为自动回归测试,以确保故障处理不会因为缺乏测试而随着时间的推移而变坏。

我们如何在Simics 5中改进故障注入?基本上,通过提供一个易于使用的框架来标准化应该如何编写错误注入器,以及它们对用户的用户界面。作为框架的一部分,记录和回放错误注入操作非常容易。其结果是这样的标准流程:

  • 错误注入器是正确的模块,而不仅仅是脚本。
  • 因此,用户可以获取可用的故障注入器的清单,并决定使用哪一个。
  • 一旦用户决定使用哪一个,它就被加载到Simics中。
  • 然后创建错误注入器的一个新实例。
  • 然后将新实例附加到系统的某个部分。这是一个关键的步骤,因为附加错误注入器可能涉及创建新的对象、重新连接系统的设置以添加拦截点,以及将错误注入器放入要破坏的数据路径中。有时非常简单,有时非常复杂,这取决于故障的性质。
  • 一旦注入器被连接,可以启用和禁用单个故障。正确的启用和禁用逻辑取决于故障注入器,但其工作原理应该是相同的。

我们上传的演示视频Youtube演示一个简单的内存错误注入器是如何工作的。视频中的注入器是基于在内存写操作中植入断点,并改变所写的值,以便以后的读操作返回坏值。模拟设置是这样的:

fi-1

有一个测试程序正在运行,它将值写入内存,并检查是否读回相同的值:

fi-2

演示的故障很容易在模拟器中实现,但需要在硬件上进行大量工作。所建模的故障本质上是内存芯片坏了,并开始不能正确地存储写入它们的值。这就是为什么有必要拦截写入并更改写入的值——除非被拦截,否则测试程序对测试模式的写入将删除错误的任何痕迹。

视频中显示的记录和回放显示了模拟器侧(设置新的故障)和目标侧(按下键使测试程序重新运行)的动作。这种联合记录对于确保某个特定的执行可以在稍后重现以调查发生了什么至关重要。

在视频中,所有的动作都是手动和交互式地执行,以显示事情是如何完成的。在这个功能的实际使用中,错误的整个设置和应用程序都是脚本化和自动化的。任何可以通过Simics命令行交互完成的操作都可以从脚本完成并自动完成

总之,故障注入是基于模拟器的测试实验室的一个非常强大的功能,通过Simics 5,我们可以更容易地创建和重用故障注入器,并支持围绕故障注入活动的结果的协作工作流。

更多的阅读

如果您想阅读更多关于故障注入和Simics的内容,我们有一些较早的博客文章。

以前的你的实验室在云端吗
下一个仿佛就在昨天…