现场调试:诊断软件故障的同时仍然确保系统的可用性_第1页
现场调试:诊断软件故障的同时仍然确保系统的可用性_第2页
现场调试:诊断软件故障的同时仍然确保系统的可用性_第3页
现场调试:诊断软件故障的同时仍然确保系统的可用性_第4页
现场调试:诊断软件故障的同时仍然确保系统的可用性_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、现场调试:诊断软件故障的同时仍然确保系统的可用性QNX 软件系统公司技术分析师Paul L摘要实际场用的软件 bug 不仅会导致系统运行异常、降低系统的可用性,还会给用户造成不便(甚至造成客户不开心而流失)。遗憾的是,传统调试方法本身就会干扰并影响系统的可用性、性能和正常运行。为此,本文为您介绍了一些调试方法和信息收集技术,以便在诊断过程中确保系统的可用性,帮助查找并解决软件故障。简介现代嵌入式系统中可能有数百个软件任务在运行,所有这些任务都会共享系统资源并以复杂的方式交互。这种复杂性会影响系统的可靠性,简单来说,系统包含的代码越多,出现编码错误的可能性就越大

2、。(据估计,一个百万行的代码中至少会有一千个漏洞,即使该代码经过方法学的开发和测试。)编码错误还会影响系统安全,因为黑客常常会利用它们作为恶意攻击的突破口。不管进行多少次测试都无法完全消除这些软件漏洞和安全漏洞,因为没有任何测试套件能预测复杂的软件系统可能遇到的运行情况。因此,系统设计人员和软件开发人员必须保持“任务关键意识”,采用能遏制软件错误的软件架构,使其从故障中迅速恢复。同样重要的是,开发人员必须使用工具和调试技术,以在排除故障的过程中确保系统的完整性。调试工具不能对系统运行产生不利或未知的影响,特别是当系统正在为用户提供服务时。一旦开发人员修复软件组件,工具和底层操作系统应便于上载和

3、监视修复的版本,同样不会影响系统的整体运行和可用性。通过跟踪系统深入观察当复杂的软件系统运行缓慢或异常时,利用系统交互的总数查找故障原因会是一项非常艰巨的任务。例如,有几十个或上百个线程在多处理器或多核系统中运行和交互,其中一个线程意外中断,这一故障是哪个事件或交互导致的呢?不使用工具查看整个系统的话,原因可能归咎于系统的某个部分,但事实上,故障点位于其他地方。传统调试工具在诊断系统时,通常以侵入的方式改变其运行,因而使事态更加复杂。例如,源代码调试程序会中止调试中的程序而不是整个系统,因而会改变系统的运行顺序。这种现象通常称为探测影响它会暂时掩盖竞争状态,而且会引入只在进行调试时才会出现的“

4、错误”。当然,传统的源代码调试工具和应用程序剖析工具对目前复杂的多处理器、多语言系统仍很重要。但只有在开发人员确定需要修复哪个组件或组件集合时,它们才会发挥作用。为此,开发人员必须首先理解系统是如何以整体方式运行的。例如,在多核系统中,开发人员必须能确定哪个核在交换信息,它是以什么顺序进行交换的。开发人员还须识别参与每次核间交互的是哪些进程或线程,并跟踪核间跃迁的执行轨迹。深入观察系统运行的关键途径是跟踪系统。系统跟踪涉及到很多工具和技术,其中包括: 负责标记程序进度的 printf() 调用 负责监视任务创建和跟踪资源使用的系统信息工具(例如,Unix top 命令) 实现应用程序剖析和代码

5、覆盖的编译器驱动的检测技术 负责分析程序的内存使用历史和诊断故障(如内存泄漏、内存碎片过多)的内存跟踪工具 可在操作系统级别显示事件的内核级检测技术,可进行精确计时跟踪并显示多个进程与线程间复杂的交互故障技术进程间通信 (IPC)监视线程间的消息流。瓶颈资源竞争监视状态更改的线程。整体运行缓慢查看 CPU 使用情况以识别消耗最多CPU 周期的进程或线程。搜索用户事件以确定导致延迟的线中断等待时间过长程,然后在该线程中插入自定义事件以查找故障。多核系统内的线程监视在 CPU 间迁移的线程。过度迁移表 1 一些常见的故障以及开发人员如何使用系统剖析器进行故障诊断的说明。试想,系统剖析器(一种可视化

6、工具)成为 QNX Momentics 集成开发环境的一部分。与可在单独程序中跟踪线程间控制流的调试程序一样,这种工具能使开发人员“了解”系统内的不同组件是如何交互的,这些组件是全部在单独处理器上运行,还是在多个处理器上运行。如果出现故障,该工具能帮助确定事件发生的时间、涉及到的软件组件、这些组件的运行内容,更重要的是,如何解释事件。在确保系统可用的同时深入观察好的系统剖析器是非侵入式的;它无需修改代码即可允许用户观察,而且对系统运行的影响极小。如执行得当,开发人员就能借助它诊断实时系统的故障,而不会干扰系统提供的服务或使其性能减退。为确保“非侵入性”,系统剖析器通常会快速、有选择地记录系统事

7、件,包括信息、内核调用、线程状态更改和中断。不必修改用户编写的代码,因为这种事件记录可由经检测的内核执行。以用于 QNX Neutrino实时操作系统的经检测的内核为例,它不过是一种具有小型、事件收集模块的标准 QNX Neutrino 微内核。当被触发时,该模块会截获有关内核运行内容的信息,生成带有时间和 CPU 标记的事件,并复制到一组在环形链表内分类的缓冲区内。当缓冲区内的事件数目达到最大值时,记录工具会将数据写入目标机上的存储位置(如电池支持的 SRAM) 或使数据直接流入开发主机,后者不必在目标机上另外进行存储。如正确设计,经检测的内核就能以与标准、未检测的微内核几乎相同的速度运行。

8、运行性能只有在收集事件时才会受到影响。但即便如此,内核仍能提供各种机制以确保最少的侵入。例如,内核允许开发人员仅在一定条件下才能触发事件记录。它还能提供用户可定义的筛选器,这样记录进程只会收集用户感兴趣的事件开发人员就能按需要尽可能多或尽可能少地记录事件。插入用户自定义的事件图 1. 系统剖析器能针对内核调用、硬件中断、线程状态更改、进程间通信和其他系统级事件收集和分析数据,使开发人员能查明死锁、逻辑缺陷和其他性能降低的状况。确定应用程序中特定事件的计时通常很有用。因此,经检测的内核还应允许开发人员在系统中插入用户定义的跟踪事件。例如,为跟踪处理一个数据包所需的时间,开发人员能在数据包进入和离

9、开系统时创建事件。有时,经检测内核提供的数据过于详细,以致很难理解问题代码确切的运行内容。用户自定义的事件有助于解决这一问题。将用户定义的事件置于整个应用程序代码或中断处理程序中,开发人员就能创建事件序列,显示程序响应的操作类型和涉及的代码部分。隔离非法内存访问如果正确设计,实时操作系统就能简化隔离任务,解决实时系统中出现的各类故障,包括非法内存访问。例如,在微内核实时操作系统中,只有少数核心基本对象(如信号、计时器、调度程序)才会在内核中执行。所有其他组件设备驱动程序、文件系统、协议栈、用户应用程序,都会作为单独、内存受保护的进程在内核外部运行。参见图 2。图 2. 在微内核操作系统中,几乎

10、所有组件出现故障时都能重启,不会破坏内核,无需重启整个系统。使用软件监视程序确保高可用性许多嵌入式系统都使用硬件监视计时器检测软件或硬件是否“异常”。通常,系统软件的某些组件会检查系统的完整性,然后启动计时器硬件,说明系统运行正常。如计时器没有正常启动,它便会终止并导致处理器复位。有利的一面是系统会从软件或硬件锁定状态中恢复;不利的一面是系统必须完全重启,这会造成某些系统的停机时间过长,并丢失状态信息。现在让我们来了解内存受保护的系统中发生的情况。如果软件出现间歇错误,操作系统会捕获事件并将控制传至名为软件 watchdog 的用户空间进程中。该进程会就如何以最佳方式从故障中重启做出智能判定。

11、与硬件监视程序进行全复位不同,软件监视程序会: 终止因非法内存访问导致故障的进程,然后重启该进程而无需关闭系统的其他组件或者 终止故障进程或相关进程,初始化硬件使其进入“安全”状态,然后以协调方式重启终止的进程或者 如果故障非常严重,它会以可控方式关闭整个系统,并向系统操作员发出警报与硬件监视程序不同,软件监视程序允许开发人员对嵌入式系统进行智能、编程控制,即使控制软件中有多个进程由于各种原因运行失败。硬件监视计时器能使系统从硬件闩锁中恢复,但软件监视程序能更好地控制软件故障。更突出的是,软件监视程序能监视传统硬件监视程序看不到的系统事件。例如,硬件监视程序能确保驱动程序为硬件服务,但却很难检

12、测到其他程序是否正与该驱动程序正确通话。软件监视程序能弥补这一不足,它会在驱动程序出现问题前采取行动。图 3. 在 core 文件上进行事后调试。创建 core 文件进行脱机分析在进行部分重启时,软件监视程序还能收集有关软件故障特征的信息。例如,如果系统包含或访问大容量存储器(闪存、硬盘、通过存储器连接另一台电脑的网络),软件监视程序会调用转储工具生成按时间顺序排列的 core 转储文件。转储文件会提供所需的信息,以识别导致进程故障的源代码行,以及函数调用历史、数据项内容和其他诊断信息。开发人员能像调试目标机系统上的动态应用程序那样调试转储文件,逐句通过调用栈以确定导致故障的事件。在某些情况下

13、,需要尽快重启出现错误的进程。如果这样的话,开发人员就需要重启进程然后完成 core 转储。某些软件监视程序实现,如 QNX 关键进程管理器能进行这种程度的控制,允许开发人员更改操作顺序、获取内核踪迹、增加决策功能。使用转储工具的变体(负责获取即将终止进程的内核信息的服务),开发人员可针对特定进程创建转储文件,即使该进程尚未非法访问内存。该工具只是让进程“暂停”,再将进程的代码和数据复制到缓冲区内,然后释放进程。转储工具接下来会将缓冲区写入转储文件。这样做的好处呢?如果一个实时系统出现运行异常,开发人员就能获取快照进行后续分析,不必关闭系统或陷入停机状态。上传修复的版本通过对 core 文件进

14、行事后分析,开发人员就能以脱机方式调试并修复故障,不必让现场布署的系统停止服务。但在故障修复后,开发人员仍面临挑战使用新代码更新目标机系统。当需要更新应用程序级代码时,大多数现代操作系统都会出现问题。实际上,某些操作系统甚至允许新的系统服务(如驱动程序和协议)以动态方式连接内核。由于这些服务在内核空间内运行,因此很难将其终止、移除,以及使用新版本替换。除非关闭和重启系统,否则对这些服务进行更新会很困难。Driver attemptsWatchdogFixed driverreplacesinvalid memoryrestarts driver &old driver whileaccess.

15、creates dump file.system runs.DumpfileDump fileFixed driveris debuggedis uploaded tooffline.the field.图 4. 软件监视程序能自动重启故障组件,无需停机或操作员的干预。监视程序还会生成进程转储文件以进行事后调试,使开发人员能设计可现场上传的修复版本。为解决这些问题,操作系统至少应允许设备驱动程序和其他系统服务能以动态方式卸载。但即便如此,在许多情况下,都要求在不中断驱动程序提供的服务时对其进行升级。因此,操作系统应确保在旧版驱动程序运行的同时,启动新版驱动程序,然后使新版驱动程序逐渐取代目前的

16、驱动程序。当完成过渡后,操作系统会终止旧版驱动程序,收回其使用的所有资源。使用时间分区诊断故障时间分区可在对系统进行调试的同时,确保关键进程获得所需的 CPU 周期以正常及时地运行。利用这种技术,开发人员可将程序置于虚拟区间(即分区)中,并为每个分区定量分配 CPU 时间。这些资源保证能: 遏制拒绝服务 (DoS) 攻击 防止编写不当的进程或恶意进程独占其他进程所需的资源 确保优先级低的功能随时获得所需的 CPU 周期 允许系统动态支持新的程序和服务,同时确保现有服务仍可获取足够的计算资源同样重要的是,分区技术允许开发人员不必终止 CPU 时间的关键进程就能调试系统。例如,系统设计人员可为调试

17、程序和其他相关的通信进程保留 10% 的 CPU 时间;参见图 5。由于每个子系统都可获得定量分配的 CPU 时间,因此调试操作消耗的 CPU 周期不会影响系统核心功能的性能和可用性。在系统被布署到现场前,时间分区技术能简化日常测试和调试过程。例如,在单元测试阶段,代码缺陷会导致引发调试终止的系统失控。在这种情况下,系统会处于锁定状态,开发人员只能通过重启解决问题,因此会丢失有用的诊断信息。为防止出现这种情况,开发人员可创建一个分区,确保为控制台登录和远程调试提供 CPU 时间。这些资源保证允许开发人员继续调试并收集所需的信息诊断故障。将不用的调试周期分配到其他进程分区调度程序的地位并不平等。

18、某些实现会随时严格执行 CPU 预算,因此即使每个分区无事可做,也会消耗其全部的预算。其他实现会采取更加灵活的方式,将不用的 CPU 周期动态地分配至可从额外进程时间中受益的分区;这种方式最大程度提高了 CPU 利用率,使系统能有效应对高峰需求。例如,在 QNX Neutrino 自适应分区技术中,调试分区只会在调试程序需要时,才会消耗其预算下的 CPU 周期。如调试程序空闲,调度程序会将闲置的周期分配至其他分区。开发人员能轻松地将自适应分区技术融入目前的软件设计中。它是基于业内标准的 POSIX 编程模型的,因此开发人员无须重写代码或学习特殊的编程技术。基于优先级的调度程序会根据传统的抢占规则,对分区内的线程进行调度。调度策略,如先入先出 (FIFO) 调度、循环调度和偶图 5. 系统设计人员可利用时间分区技术为每个软件子系统(包括调试工具)保留一定量的 CPU 时间。针对快速出错通报和系统恢复的分区许多嵌入式系统无法容忍停机时间,因而须一直保持可用状态。以下是可用性的正式定义: = + MTBF 表示平均故

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论