现场调试:确保系统可用的同时诊断软件故障
摘要: 现代嵌入式系统中可能有数百种软件在运行,所有这些软件都会共享系统资源并以复杂的方式交互。这种复杂性会影响系统的可靠性,简单来说,系统包含的代码越多,出现编码错误的可能性就越大。(据估计,一个百万行的代码中至少会有一千个漏洞,即使该代码经过系统的开发和测试。)编码错误还会影响系统安全,因为黑客常常会利用它们作为恶意攻击的突破口。
关键字: 嵌入式系统, 共享系统资源, 编码错误, 诊断系统
现代$中可能有数百种软件在运行,所有这些软件都会共享系统资源并以复杂的方式交互。这种复杂性会影响系统的可靠性,简单来说,系统包含的代码越多,出现编码错误的可能性就越大。(据估计,一个百万行的代码中至少会有一千个漏洞,即使该代码经过系统的开发和测试。)编码错误还会影响系统安全,因为黑客常常会利用它们作为恶意攻击的突破口。
不管进行多少次测试都无法完全消除这些软件漏洞和安全漏洞,因为没有任何测试套件能预测复杂的软件系统可能遇到的所有情况。因此,系统设计人员和软件开发人员必须保持“任务关键意识”,采用能遏制软件错误的软件架构,使其从故障中迅速恢复。同样重要的是,开发人员必须使用工具和调试技术,以在排除故障的过程中确保系统的完整性。调试工具不能对系统运行产生不利或未知的影响,特别是当系统正在为用户提供服务时。一旦开发人员修复软件组件,工具和底层操作系统应便于上载和监视修复的版本,同样不会影响系统的整体运行和可用性。
通过跟踪系统深入观察
当复杂的软件系统运行缓慢或异常时,如果任务不是非常大的话,可利用系统交互的总数查找故障原因。例如,有几十个或上百个线程在多处理器或多核系统中运行和交互,其中一个线程意外中断,这一故障是哪个事件或交互导致的呢?不使用工具查看整个系统的话,原因可能归咎于系统的某个部分,但事实上,故障点位于其他地方。
传统调试工具在诊断系统时,通常以侵入的方式改变其运行,因而使事态更加复杂。例如,源代码调试程序会终止调试中的程序而不是整个系统,因而会改变系统的运行顺序。这种现象通常称为探测影响——它会暂时掩盖竞争状态,而且会引入只在进行调试时才会出现的“错误”。
当然,传统的源代码调试工具和应用程序剖析工具对目前复杂的多处理器、多语言系统而言仍很重要。但只有在开发人员确定需要修复哪个组件或组件集合时,它们才会发挥作用。为此,开发人员必须首先理解系统是如何以整体方式运行的。例如,在多核系统中,开发人员必须能确定哪个内核在交换信息,它是以什么顺序进行交换的。开发人员还须识别参与每次内核间事务的是哪些处理器或线程,并跟踪内核间的执行路径。
暂无评论