(计算机应用技术专业论文)os_aware调试技术的研究与实现.pdf_第1页
(计算机应用技术专业论文)os_aware调试技术的研究与实现.pdf_第2页
(计算机应用技术专业论文)os_aware调试技术的研究与实现.pdf_第3页
(计算机应用技术专业论文)os_aware调试技术的研究与实现.pdf_第4页
(计算机应用技术专业论文)os_aware调试技术的研究与实现.pdf_第5页
已阅读5页,还剩62页未读 继续免费阅读

(计算机应用技术专业论文)os_aware调试技术的研究与实现.pdf.pdf 免费下载

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

文档简介

摘要 近年来,嵌入式软件作为计算机领域研究的一个重要分支得到了飞速的发 展。由于嵌入式软件具有实时性、高可靠性等特点,它的开发相对于传统应用程 序的开发要复杂得多,因而对相应的嵌入式软件开发工具也提出了更高的要求。 嵌入式调试工具,作为嵌入式开发工具的一个关键组成部分,在软件开发中扮演 着十分重要的角色。好的调试工具可以帮助用户高效便捷地开发出优质的软件。 然而,当前我国在嵌入式软件开发中所使用的调试工具多是国外产品,价格昂贵, 不利于推广。因此,对嵌入式软件开发中调试技术的研究和应用具有十分重要的 理论和实用价值。 本课题的目标就是是实现一个面向嵌入式领域的o sa w a r e 调试工具,主要 功能是显示系统和对象信息,并且该工具能够保存和重现有关的调试信息,用户 可以根据这些详细的信息对嵌入式开发进行更为精确的分析,从而编写出高质量 的软件。本文首先是对调试技术和嵌入式交叉调试技术进行理论分析,接着对 o sa w a r e 相关调试技术进行了深入研究,分析了他们实现和使用的优缺点,结 合实际情况确定了课题的技术路线和需求,最后对其进行设计、实现和测试。整 个o sa w a r e 调试系统采用模块化和层次化设计,系统功能强大,图形界面生动, 具有良好的命令响应实时性、可配置性,可以满足不同用户的调试需求。 关键词:嵌入式系统、调试技术、0 s a 、v a r e 、目标总代理、信息代理 a b s t r a c t c u r r e n t l y ,e m b e d d e ds y s t e m sh a sb e e ng r e a t l yi m p r o v e d a sas i g n i f i c a n tb r a n c h i nc o m p u t e n d u et or e a l t i m e ,h i g h r e l i a b i l i t yo f e m b e d d e d s o f t w a r e ,i t sd e v e l o p m e n t i sm u c hm o r ed i f f i c u l t c o m p a r e d w i t ht h e d e v e l o p m e n t o ft r a d i t i o n a l a p p l i c a t i o n t h u s ,i tp o s e sm o r eh i g hr e q u e s t s f o r c o r r e s p o n d i n gd e v e l o p m e n t t o o l s d e b u g g i n gt o o l s ,a sac r i t i c a lc o m p o n e n t i nd e v e l o p m e n t t o o l s ,p l a yi m p o r t a n t r o l e si nt h e m g o o dd e b u g g i n gt o o l sc a r l h e l p c u s t o m e r sd e v e l o p h i g h - q u a l i t y s o f t w a r ee f f e c t i v e l y h o w e v e r ,t h em a j o r i t yo fd e b u g g i n gt o o l s c u r r e n t l yu s e di n c h i n aa r ef r o me x p o r t s ,w i t ht h e i rh i g hp r i c e s ,t h e s ee x p o r t sa r en o te a s yt ob e p o p u l a r i z e d s o ,t h er e s e a r c ha n da p p l i c a t i o nw o r k o nd e b u g g i n gt o o l si nt h ef i e l do f e m b e d d e ds o f t w a r ep o s s e s s e ss i g n i f i c a n tv a l u eb o t ho nt h e o r e t i c a la n do np r a c t i c a l w o r k o s _ a w a r e ,ad e b u g g i n gt o o lf o re m b e d d e dd o m a md e s i g n e da n da c c o m p l i s h e d i st h et a r g e to ft h i s p a p e r t h em a i nf u n c t i o ni ss h o w i n gs y s t e m i n f o r m a t i o na n d o b j e c ti n f o r m a t i o n ,a n di t c a ns a v ea n dr e c u rd e b u g g i n gi n f or e l a t e d t h ec o n s u m e r c a na n a l y s ea c c u r a t e l ye m b e d d e ds o f t w a r eb a s e do nt h ep a r t i c u l a ri n f oa n ds ow r i t e h i g hq u a l i t ys o f t w a r e f i r s t l y , t h i st h e s i sa n a l y s e sd e b u g g i n gt e c h n o l o g ya n dc r o s s d e b u g g i n gt e c h n o l o g y i n t h e o r y t h e n ih a v er e s e a r c h e dd e e p l yt h e d e b u g g i n g t e c h n o l o g ya b o u to s _ a w a r e ,a n dh a v ea n a l y s e d t h e i re x c e l l e n ta n dd i s a d v a n t a g eo f t h ei m p l e m e n ta n du s e b a s e do nt h ea c t u a lc i t e s ,w em a k es u r ea b o u tt h et e c h n o l o g y r o u t ea n dr e q u i r e m e n t a tl a s tw ed e s i g na n di m p l e m e n tad e b u g g i n gt 0 0 1 t h es y s t e m a d o p t sm o d u l ea n dh i e r a r c h yd e s i g n ,h a sp o w e r f u lf u n c t i o n s ,r e a lt i m ef e a t u r e s ,a n d p o r t a b i l i t ya n d i se a s y c l i p p e dw h i c hm e e t st h er e q u i r e m e n t so f v a r i a b l eu s e r s k e y w o r d :e m b e d d e ds y s t e m 、d e b u g g i n gt e c h n o l o g y 、o s a w a r e 、t a r g e ta g e n t 、 i n f oa g e n t 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工 作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地 方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含 为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。 与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明 确的说明并表示谢意。 签名:5 主! ! ! 鱼日期:妒甲年ip 月,6 日 关于论文使用授权的说明 本学位论文作者完全了解电子科技大学有关保留、使用学位论文 的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁 盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文 的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或 扫描等复制手段保存、汇编学位论文。 ( 保密的学位论文在解密后应遵守此规定) 签名:j 塑! i 墨导师签名:显三匮: 日期:沙吖年f o 月z o 日 第一章引言 1 1 课题背景 第一章引言 嵌入式软件的应用与开发是当今计算机软件发展的一个热点。随着嵌入式技 术的发展,嵌入式应用的不断增长以及嵌入式系统复杂性不断提高,要求嵌入式 软件的规模和复杂性也不断提高。嵌入式软件的质量和开发周期对产品的最终质 量和上市时间起到决定性的影响,嵌入式软件的开发、调试、分析与测试成为了 研究的热点。 随着计算机硬件技术的进步,硬件的集成度越来越高,从而使嵌入式设备的 硬件性能得到了极大的提高;与此同时,通过采用成熟的商用操作系统,使系统 运行在一个高性能的、可靠的软件平台上,为实现各种大型的复杂的应用打下了 良好的基础。面对系统复杂性的增加,自然需要功能强大、性能稳定的应用软件 与之相适应。所以,在嵌入系统开发中软件的规模也越来越大。同时,系统又要 求应用也要精简高效、稳定可靠,使软件的开发在整个系统开发中所占的时间也 越来越长,软件的质量对产品的最终质量起到了决定性的作用。但是事实上由于 软件的开发缺乏科学的管理手段,缺乏些有效的调试工具,开发的软件得不到 很好的调试与分析,就很难编写出比较合格的代码,所编写的程序没有得到有效 的测试就交付给用户使用。那些没有运行过的代码带着潜在的危险交付到客户手 中,经常会给用户带来巨大的经济损失,为产品供应商带来信誉上的损失,在一_ 些特殊的领域甚至会危及人的生命安全。 综上所述,随着嵌入式系统的发展,我们迫切需要一种工具能够在嵌入式软 件开发调试时对嵌入式系统的软件进行仔细分析,以保证软件的质量和可靠性。 因此本文的着眼点就在于分析别人,吸收别人的精华。重点是在分析比较别人已 有的基础之上提出自己的观点,按着自己的观点设计我们的体系结构,按着该体 系结构实现自己的o sa w a r e 调试工具。让读者可以对调试工具整个结构有着清 晰的认识,并可以对其提出改进的意见。如果能达到这样的目标,那么这篇论 文的目的就已经达到了。 1 ,2 课题综述 o s - a w a r e 调试技术的研究与实现课题来自北京科银京成技术有限公司,该 第一章引言 课题的目标是实现一个面向嵌入式领域o s a w a r e 调试工具。现阶段确定的主要 功能有四个: 1 显示系统和对象信息 2 挂起和恢复系统中的任何任务 3 对系统中的对象进行操作 4 显示例外错误 5 个别信息( 如任务栈使用率等) 图形显示 o s a w a r e 调试工具的特点是: 1 应用清晰简单的界面,使宿主机端能够方便的移植到其它桌面o s ,采 用模块化和层次化设计,对核心数据处理模块的改写,都不会对接口构 成严重的影响。 2 可扩展、可配置,具有良好的通用性等特点。 1 3 选题的意义和价值 基于前面的分析,我们可以知道嵌入式系统有着巨大的市场,而且嵌入式软 件在可靠性和稳定性都有着极高要求。但是由于嵌入式软件和嵌入式操作系统的 特殊性,嵌入式系统的开发需要特殊的开发调试方法,这就对嵌入式操作系统的 调试工具和调试环境提出了特殊的要求。 目前的嵌入式操作系统的调试工具和调试环境还不尽人意,这导致了嵌入式 软件的开发比普通软件开发难度大,开发调试周期长等问题。国外提供的相关 o s a w a r e 调试工具,具有价格高昂,并且不提供源代码。国内对这方面的工具 开发很少,而且存在不少问题。因此,随着嵌入式操作系统和嵌入式软件的广泛 研究和应用,需要对嵌入式操作系统的调试理论进行研究,对嵌入式操作系统的 调试环境和工具进行改进,从而有效地降低嵌入式软件开发的难度,缩短嵌入式 软件开发调试的周期。这样就可以在一定程度上降低嵌入式系统开发的成本,使 得嵌入式系统能够尽快为大多数消费者所接受。 本课题基于以上的要求对嵌入式操作系统相关理论进行了研究,对嵌入式软 件开发调试方法进行了系统的总结。功能强大、使用方便的o s a w a r e 调试工具 的实现将减轻调试人员的工作量,加快任务级调试的速度。其灵活性、通用性、 扩展性将使用户使用更加方便,也为以后继续设计与开发、添加新的功能打下基 础。对配置文件的没计与实现和调试信息的保存和重现,也具有十分重要的意义。 该工具在课题合作单位得到初步应用,实践证明该工具能有效地降低了嵌入式软 件开发和调试难度,提高了嵌入式软件开发的效率,缩短了嵌入式软件开发周期。 综上所述,本课题研究无论在理论上还是在实际应用上都有着一定的意义和价 第一章引言 值,并且具有广泛的社会经济价值。 1 4 本文的主要工作 作者在本课题的研究过程中,承担了主要的理论研究,方案设计,以及实现 和测试等大量的工作。 作者在嵌入式软件的开发过程中,注意到了其调试和测试过程存在的问题, 并致力于改进嵌入式软件在调试方法的理论研究,最终提出了提高嵌人式软件开 发效率的o sa w a r e 调试工具的方案,并且实现了该方案。 从2 0 0 3 年3 月份开始,作者阅读了大量的嵌人式系统方面的文档,对其中 的原理进行理论研究,著实际了解调查了许多嵌入式软件开发人员在软件开发过 程中的困难和需求,开始为其相关的方案做准备工作。并承担了o sa w a r e 调试 器的需求分析、概要设计、详细设计、测试等的工作,为最后的调试跟踪过程的 改进提供了重要的依据。 主要完成的工作如下: 嵌入式操作系统的原理学习 嵌入式操作系统特殊的调试理论和方法的研究 嵌入式操作系统下软件交叉开发调试过程的研究 嵌入式操作系统d e l t a c o r e 的基本原理的研究 嵌人式操作系统v x w o r k s 调试环境和l a m b d a g d b 调试环境的分析 嵌入式操作系统目前常规的调试工具的存在的问题调查 o sa w a r e 调试器的实现。其中包括了: 1 o sa w a r e 调试器的需求分析 2 o sa w a r e 调试器的概要设计 3o sa w a r e 调试器的详细设计 4 根据设计文档进行编码 5发布测试版本给用户使用,并收集新的信息反馈,以便改进 6根据测试版本中出现的问题对文档进行相应的改正,以及对应的编 码部分做相应的修改 1 5 章节安排 第一章介绍了本课题的背景和一些情况; 第二章介绍了本课题所涉及的一些基本概念,以便研究能够深入进行; 第三章详细介绍了本课题的国内外最新动态以及一些主流产品的分析,然后 第一章引言 介绍了课题的技术路线和功能需求; 第四章对o sa w a r e 总体设计: 第五章细致描述了o sa w a r e 主要模块的实现的设计思路和方法 第六章介绍了o s _ a w a r e 的单元和系统测试的实施过程和方法; 第七章对本文进行的总结; 最后是致谢和参考文献。 第二章理论分析和基本概念 2 1 调试技术概述 2 1 1 调试技术的概念 第二章理论分析和基本概念 在软件开发过程中,程序出现错误是在所难免的,而如何发现并纠正这些错 误,无论对于一般软件开发还是嵌入式软件开发都是必然面对的一个问题。调试 器的产生就是用来解决此类问题的。 “调试器”是用于跟踪程序执行情况,快速有效地定位错误产生的位置从而 找到引起错误的原因,并改正错误的工具。尽管调试器经常用于软件测试过程中, 但是“调试”与“测试”却有很大的不同。“调试”是诊断己知错误,得到导致 错误的准确原因并改正,并且调试器在软件开发生命周期中的其它阶段也会用 到。 采用什么样的调试技术在很大程度上依赖于程序中的错误多少以及程序复 杂度。一般来说,纠正一个系统中的错误通常依次按照下面的步骤进行: 收集信息。这一步用于获得“b u g ”的相关信息,比如程序出错时的现 象、“b u g ”可能涉及到的数据结构、“b u g ”所在的大致范围( 某个模 块或者子系统) 。 分析定位。当获得足够的关于“b u g ”的信息之后,我们必须分析产生 错误的原因。在这个过程中我们可以直接通过代码分析或者动态检查程 序运行状态来逐步定位错误。 纠正错误。当获得了“b u g ”充足的信息之后,必须拿出一个解决方案。 纠正错误的原则是改正原来的错误而不引入新的错误。因此,纠正错误 之后必须再进行测试。 调试器最重要的功能就是收集信息和分析定位。 2 1 2 调试技术的发展 早期的计算机都是顺序执行的,编程语言以及开发环境也都反映了这种特 点,调试器也不例外。当时的调试工具都被设计成为单线程控制的。 1 9 7 5 左右,应用于各种体系结构计算机、操作系统或者编程语言的调试系 第二章理论分析和基本概念 统被开发出来。分析内存错误的调试工具出现以后,调试技术得到了快速的发展。 这时,调试器的实现技术开始被归类为几种基本类型:静态分析,事件驱动,交 互式以及事后剖析( p o s t m o r t e m ) ,调试器一般采用一种以上的调试技术。调试 器还有另外一种分类方式:静态调试器和动态调试器,静态调试器主要用于分析 程序源代码,动态调试器主要用于分析程序的执行情况。下面简单介绍一下这些 技术: 静态分析。这种调试技术现在一般都由编译器完成,对源代码进行语法 以及安全性分析,防止程序语句的非法跳转以及未初始化变量的非法引 用等。 事件驱动。调试器和被调试程序之间的交互通过事件进行。采用这种技 术的调试器在工作的时候,预先定义一系列条件,然后当某个事件满足 条件的时候就会触发相关的动作。比如,会改变程序执行状态,显示某 个变量的值或者执行用户自定义的其它动作。还有一种采用事件驱动技 术的调试器,能利用事件的日志文件来记录程序的执行情况,然后根据 记录与预计的状态进行比较,从而找到错误的所在。 交互式技术。这是到日前为止,最为常用的调试器实现方式,这种调试 器有时也被称为“断点”调试器。典型的交互式调试器提供用户接口( 通 常是命令行方式或者图形化界面) ,使用者可以使用各种命令控制正在 运行的被调试程序。这种调试器一般都采用向被调试程序插入断点的方 法来控制程序的执行,当程序运行到断点的时候就会停止,然后用户可 以检测此时被调试程序的各种状态比如变量值,寄存器值等。交互式调 试器经常用于循环调试( c y c l i c a ld e b u g g i n g ) ,这也是软件开发人员最常 用的调试技术。当程序发生错误后,在可疑的地方设置断点反复的重新 运行程序,在程序停止到断点处时检查程序的状态,既而逐步跟踪捕获 到程序的错误。 事后剖析技术( p o s tm o r t e m ) 。还有一种调试方式就是事后剖析技术, 它通过程序的日志文件获得正在执行程序的信息,由调试器完成分析, 重放程序的执行过程,这样,使用者就可以反复的检查程序的状态直到 确定程序的出错原因。 8 0 年代早期,随着并行计算机开始商业化应用,并行编程技术也就被广泛 接受。第一个用于并行系统的调试器是从交互式串行调试器改造而来的,它可 以处理多进程,如“d b x t o o l s ”。有些调试器也专用于某些并行语言,如“y o d a ” 调试器专门用于调试a d a 语言。在8 0 年代后期及9 0 年代前期,出现了大量应 用于并行系统调试的调试器,m c d o w e l l 和h e l m b o l d 将这些调试器分为以下几 第二章理论分析和基本概念 类: 传统调试技术的扩展 事件驱动调试技术 静态分析技术 其它实现技术 1 9 9 7 年,并行工具开发协会( t h ep a r a l l e lt o o l sc o n s o r t i u m ) 发起了“高性 能调试论坛( h i g h p e r f o r m a n c ed e b u g g e rf o r u m ) ”,目的是为了指定一套和高性 能计算系统相关的调试工具相关的标准。因为在此之前,由于调试器没有统一的 关于提供功能方面的定义,结果造成各种调试器的设计相差很大,提供的功能也 各不相同。在1 9 9 8 年,出版了第一版的高性能计算系统调试标准,人们就能够 明确的知道用于高性能计算系统调试的调试器所能提供的基本功能。 早期的调试器只能通过分析保存在d u m p 文件中的内存和处理器状态信息完 成调试功能。丽现在的调试器复杂程度已经大大增加了,许多调试工具特别是交 互式调试器,都提供了诸如设置断点、单步操作、内存和寄存器读写、防止内存 非法访问和程序异常处理等功能。 目前的调试器一般都作为一个单独的应用程序,拥有它们自己的进程空间。 在多用户内存保护模式下,调试器必须能够访问并且控制被调试程序。对于交互 式调试器来说,这个功能的实现一般要借助于操作系统提供的各种调试接口。比 如,在u n i x 操作系统中,可以利用系统调用p t r a c e ( ) 来完成这样的功能,因此 调试器的实现也越来越趋向于依赖某种操作系统和体系结构。而最近几年,开始 出现更便捷的调试器,这类调试器把那些和具体机器相关的代码分离出来,这样 当调试器增加对某些体系结构支持功能的时候,只需单独添加这些部分代码即 可。 2 1 3 调试技术的分类 调试器是软件开发中很常用的工具,但是对于不同的应用程序或者不同的 b u g 类型来说有时需要各种不同用途的调试器。一般来说调试器可以按照下面的 标准分类: 源代码级调试器( s o u r c e - - l e v e l ) 和指令级调试器( m a c h i n e - - l e v e l ) 在软件调试过程中,如果能够提供正在执行的机器指令与源代码的映射,将 会给软件开发者提供极大的便利。对于软件开发人员来说,他们所直接接触的是 高级语言,然后再通过编译器编译成可以在机器上直接执行的机器语言,如果要 通过分析一串机器语言来找到程序出错的原因,对于大部分开发人员来说不啻为 一个恶梦。过去的调试器都不能提供这种功能,现在的编译器一般可以在编译的 第二章理论分析和基本概念 时候使用d e b u g 选项往编译器中加入调试信息,然后调试器可以通过调试信息格 式的分析建立起源代码到机器指令的映射。但是某些情况下,只通过源代码调试, 还是有些问题发现不了,必须进行机器语言级调试,因此,现在的调试器一般都 具有双重功能,可以同时提供源代码级调试以及机器语言级调试。 独立调试器( s t a n d - - a l o n e ) 和集成调试器( i n t e r g r a t e d ) 调试器作为一个单独的应用程序正逐渐被集成化的调试器所替代。借助于高 度的集成化,通过使用集成开发环境可以大大地提高程序的开发效率。在这种集 成开发环境中,程序开发人员可以在发现错误后随时编辑修改他们的程序,再重 新编译、调试。集成开发环境同时可以提高软件开发的效率,比如在代码编写过 程中,软件开发人员可以随时对某个小模块进行运行调试来测试自己薪加入的代 码的正确性,这样的反复的推进式的测试,对于大型程序的开发来说无疑减少了 许多出错的可能性。 内核调试器( k e r n e l ) 和应用程序调试器 内核调试是开发设备驱动程序不可缺少的一部分。现代操作系统提供了丰富 的a p i 和工具用于修改操作系统的行为,这一般通过那些特定的设备驱动来实 现。设备驱动可以是一个简单的计时器模块,也可以是一个复杂的实时数据收集 设备的驱动程序。内核调试的方式一般是需要主机( h o s t ) 和目标机( t a r g e t ,执 行被调试程序的机器) 的协作来完成的。 应用程序调试器和在线仿真器( i n - - c i r c u i te m u l a t i o n ) 应用程序调试器在这里指的是用纯软件实现的用于调试普通应用程序的调 试器,它一般通过和操作系统协作来完成调试功能。在线仿真器( i n c i r c u i t e m u l a t i o n ) 是仿照目标机上的c p u 而专门设计的硬件,可以完全仿真处 理器芯片的行为,并且提供了非常丰富的调试功能。在使用在线仿真器进行调试 的过程中,可以按顺序单步执行,也可以倒退执行,还可以实时查看所有需要的 数据,从而给调试过程带来了很多便利。这种调试器一般都用于特殊程序的调试, 比如和硬件密不可分的嵌入式软件或者系统软件的开发。 2 1 4 调试器设计应遵循的原则 调试器所反映的信息必须真实可靠。调试器作为软件开发者用于查 错纠错的工具,它所反映的信息要作为判断程序错误的依据,因此 调试器必须做到真实可靠。比如对于高层调试器来说,在源代码到 机器代码的映射,对编译器优化代码的处理等方面必须考虑周全。 h e i s e n b e r g 原则。对于任河一种进程内( i n - - p r o c e s s ) 测试来说,测 试进程都应该尽量减少对被测系统的影响。调试器也一样,尤其是 第二章理论分析和基本概念 对于动态调试器来说,由于动态调试器在执行过程中采取向被调试 程序插入断点等手段来控制被调试程序,如果有了不合适的操作影 响了被调试程序的执行,那么调试器反映的调试信息也就不再真实, 不能够当作程序员定位程序b u g 的依据。对于大多数传统的顺序执 行的程序来说,由于调试器和被调试程序不在一个进程空间,因此 不会发生干扰,而对于分布式或者并行程序的调试来说,就需要尽 量避免这种干扰以保证调试器的可靠性。 调试器应该提供尽可能多的程序上下文信息。调试器用于跟踪错误, 它如果能够多提供一些程序上下文信息,就会给程序开发者判断错 误多一份依据,从而能更快的找到错误。因此给出被调试程序上下 文信息的多少也就反映了调试器的功能强大与否。一般来说,通用 调试器必须具备有设置断点、单步、查看指定寄存器值、查看内存 值、查看变量值等功能。对于多线程程序还需要查看多线程之间的 关系以及每个线程的运行状态等情况。 2 1 5 调试器的基本结构 各种调试器因为其应用环境不同,他们的组成结构也不完全相同。就大 多数调试器来讲,他们都有如图2 - 1 所示的结构: 图2 一l 调试器的基本结构 由图2 1 可知,用户接口由源代码、堆栈、断点、控制、反汇编、硬件寄存 器和变量组成,这些也是调试器提供给使用者的基本功能。 源代码查看功能:源代码查看功能只有对源代码级调试器才有意义,在使 用者进行调试的同时可以看到相应被调试程序的源代码。 堆栈相关功能:在程序调试过程中,使用者可以查看当前的函数相互调用 第二章理论分析和基本概念 关系,并且可以通过选择上层( 调用函数) 或者下层堆栈( 被调用函数) 来获得 相应的局部变量相关信息。 断点功能:断点实现的功能就是指明一个位置使得正在运行的进程执行到该 点时中止。这是调试器所必须提供的基本功能,调试器许多功能的实现都是建立 在断点功能基础之上的。 进程控制功能:是指调试器提供给用户控制被调试程序的各种手段,例如 单步执行,停止执行等。 反汇编功能:也是针对源代码调试器而言,调试器可以给用户提供被调试 程序的汇编代码。用户在调试过程中可以根据自己的需要选择源代码视图、汇编 视图甚至汇编源代码混合模式视图。 硬件寄存器查看功能:实时显示当前硬件寄存器的信息。 变量查看功能:用户可以查看某个变量的值或者类型信息,也可以查看当 前全部有效变量的信息。变量信息也随着被调试程序的执行而不断更新。 调试器核是调试器功能的具体实现部分。调试器控制部分负责建立和调试 器的联系,开始执行被调试程序以及被调试程序的中止等过程。符号表管理部 分是调试器实现的关键,它负责利用目标文件中的调试信息( 包含符号表) 建 立起源代码和汇编文件之问的映射关系,并且提供变量相关信息( 如变量类型, 在内存中的地址等) 。表达式求值功能是调试器根据用户输入的表达式解析出其 中的变量和运算符,从符号表求出变量对应的地址,读取相应的内存的值,然 后计算出表达式的值。 操作系统层和c p u 层:操作系统是程序的运行环境,它屏蔽了较多的硬 件特性,使得上层软件更专注于软件本身的开发,在有些开发环境中,可以由监 控程序取代操作系统,配合调试器完成复杂的调试功能。调试器某些基本功能的 实现方式很大程度上取决于处理器,因为不同的处理器提供的调试功能不同,如 有的处理器没有单步指令,必须由调试器结合断点实现。 2 1 6 调试器实现所需的基本硬件支持 调试器控制被调试进程的执行需要处理器提供相应的硬件机制支持。调 试器实现基本功能所必需的硬件机制支持至少包括: 硬件必需能够给出实现断点的一种方式。通常使用特定的指令来实 现,也可以用其它非法指令实现。在变长指令体系结构中,t r a p 以 及b r e a k p o i n t 指令都是标准的指令集中最短指令长度。这样对于调 试器来说,确保断点放到了指令边界的实现更简单。不同c p u 的断 点指令如图2 2 。调试器可以通过操作系统来读写被调试程序的执行 第二章理论分析和基本概念 代码空间,想要在某地址设置断点的时候,就把该地址的指令读出 保存起未,写入断点指令。 处理器助记符( 指令) 指令长度 70 i n t e l i n t3厂i丙 x 8 6 i一 3 10 p o w e r p 无非法操作数 图2 - 2 不同c p u 的断点指令 中断机制。硬件必须能够提供一种机制,以便被调试程序在执行的 进程中遇到某些事件能够通知调试器。 在发生中断的时候,能够读写硬件寄存器的能力( 其中包括程序计 数器p c ) 。 硬件所提供的其它对调试器实现有帮助的功能: 指令级单步( s i n g l e s t e p ) :大多数处理器通过设黄特定寄存器的控 制位来实现,一般都是由操作系统直接控制。由于控制位是处理器 的一部分,因此不会在操作系统诀定把控制权交给别的线程或者进 程的时候引起别的线程或者进程的单步执行。当执行指令级单步时, 处理器执行一条指令,然后发生“陷入( t r a p ) ”,控制权交给操作系 统并通知操作系统指令级单步完成。当c p u 发展到r i s c 的时候, 指令级单步逐渐从c p u 指令集中消失,因为它减慢了所有指令的执 行速度,但这并不是不可解决的问题。对于调试器设计来说,因为 我们可以通过解析当前p c 处指令,在下一条指令处设置断点,然后 使c p u 全速运行,那么看上去也就相当于指令级单步了。 错误检测:捕捉被调试器中发生的错误对于调试器来说是非常重要 的,毕竟,调试器最主要的目的就是找出程序中的错误。有些错误 可以由处理器检测,比如除法中零作除数以及非法访问内存等。另 外一些错误需要由操作系统检测,如某些类型的i o 操作错误,还 有的错误是由更高层的软件系统来检测的,比如数组越界等。无论 哪种情形,都要在被调试程序执行下一个操作之前由操作系统通知 给调试器,这对于用户来说很重要,因为用户需要根据当时的情况 判断到底哪里发生了错误,如果没收到错误通知而继续执行被调试 程序则会破坏错误现场导致无法判断错误产生的原因。 观察点( w a t c h p o i n t ) :观察点一般用来观察某个表达式( 变量也是 第二章理论分析和基本概念 一种表达式) 的值是否有变化了,如果有变化,马上停住程序。从 调试器实现的角度来讲就是当指定的某地址空间数据被修改时,给 调试器一个通知。它的判断依据就是应用程序在相关的地址是否发 生了写内存操作硬件对这种功能的支持一般有以下两种实现方 式:一是某些处理器有相关的寄存器,保存了观察点的起始地址和 长度,当在这段内存区域发生数据改变之前,处理器产生一个“陷 入”中止处理器的执行。另外一种实现是标记某一页数据为只读, 当这页发生非法访问的时候,检查指定的地址是否属于被非法访问 的那页。 2 1 7 调试器对被调试程序的控制过程 调试器要想调试某个进程,必须首先获得这个进程的控制权,然后才能完成 确定被调试进程的状态,设置断点和控制它的运行中止等功能。这- - 4 节我们介 绍一下通常情况下调试器对被调试程序的控制执行过程。 一旦使用者确定了要进行调试的可执行文件,调试器要做的第一件事情就是 创建被调试进程,这项工作一般要依赖于操作系统完成。通常,操作系统装入被 调试进程的时候会不装入它的首条指令,当被调试进程发生重要的事件的时候, 操作系统会中止被调试进程,然后通知调试器。 在被调试进程创建完毕之后,调试器得到通知,这个时候,可以进行设置断 点的操作。断点是一种特殊的指令,它被插入到被调试进程的内存映像中,当被 调试进程执行到断点指令时就会被中止,发生“陷入( t r a p ) ”转入断点异常处理 操作中。许多调试器的设计都是围绕着断点完成的,断点是调试器控制被调试进 程的最基本方式。调试器中的许多功能比如“运行到指定位置”也是借助隐藏的 临时断点实现。 当程序开发人员设置好必需的断点后,想要被调试进程执行到第一个断点的 位置,这时调试器开始控制被调试进程的执行。开始,调试器处于激活状态,可 以被操作系统调度,当需要运行被调试进程的时候,调试器通知操作系统完成被 调试进程的初始化,控制权由调试器转给操作系统,然后由操作系统通过系统调 用完成。操作系统把被调试进程初始化完毕,把它设置为活动进程,被调试进程 可以参与操作系统的调度,被调度时开始运行。这时调试器仍然可以得到它的“时 间片”以便接受用户的命令。不过,通常被调试进程一旦开始执行就会占用全部 的处理器h j - f n 。当调试事件( 比如断点,运行结束,程序出错等) 发生的时候, 操作系统就会中止被调试进程,保存当时的进程上下文( 全部硬件寄存器的值) , 将控制权转交回调试器。随后调试器可以检查被调试进程停止的原因以及停止时 第二章理论分析和基本概念 的各种状态信息。 被调试程序的执行发生中止多由它自己产生的一些事件导致,如断点、单 步、线程的创建删除、进程的创建删除、观察点( w a t c h p o i n t ) 事件或者异常事 件等。 当被调试进程执行断点发生中止时,调试器搜索它保存的断点列表查找被 执行的断点( 一般通过匹配被调试进程中止时p c 寄存器值的方式来查找) 。可 能发生有多个断点匹配,其中有些是内部临时断点( 比如协助完成源代码调试中 的单步) ,有些是用户设置的。也可能没有找到匹配的断点,这是因为被调试进 程中本身就有断点指令,这断点不是调试器设置的,而可能是用户编写的有明确 的目的的。这时候,调试器应当仍然把它当作正常断点处理,只不过用户界面视 图应当切换到发生断点的地方,这种情况下,调试器应当提供汇编视图而非源代 码视图,这样才能确切的知道程序停止的地方。 在被调试进程中止后,使用者完成信息的收集后需要继续执行时需要注意 一些问题。首先是修改程序计数器值的问题。如果被调试进程停止在断点处,继 续执行时,p c 寄存器和断点都要进行处理。另外一个要注意的问题就是调试器 是否需要处理所有导致被调试进程中止的异常。如果被调试进程中止是调试器的 原因( 比如设置的断点,单步等) ,那么调试器继续执行被调试进程即可。如果 是因为被调试进程本身的原因导致它的中止,那么调试器该不该处理这种异常就 成了一个问题,比如,当被调试进程中发生了除数为0 的异常,这时调试器可以 作一些处理使其忽略这个异常而继续执行。 中止调试时,调试器一般提供“终止调试”和“重新调试”两个功能,实 现时调用相应的调试a p i 函数即可。 2 1 8 嵌入式调试技术分析 最早的调试工具是模拟器( e m u l a t o r ) ,那时候最著名模拟器就是i n t e l7 0 年代 发明的“b l u eb o x ”,它是所有现代i c e 的原型。i c e 具备以下的功能: 1 1 目标访问 一个模拟器最基础的功能就是访问目标资源。一个i c e 可以以自己的 c p u 替换掉目标系统的c p u 。它本质上是目标机处理器与宿主机上软件调试 器的通信媒介。通过它,调试器能够查询修改寄存器的内容,内存值,可以 访问i o 资源。 2 1 设置断点 13 第二章理论分析和基本概念 在i c e 中最典型的是它的设置断点的功能。i c e 可以在不影响代码的情 况下设置断点,甚至这个断点复杂到可以在你的系统中实时触发。断点可以 让你能够将你的程序停在一个精确的位置。模拟器的单步功能也是用断点实 现的,这是因为处理器的单步模式是跟c 语言代码是不一样的。另外,在i c e 中还支持硬件断点功能。 3 1r a m 替代 r o m ,f l a s h 和其它一些存储媒介可能增加了调试难度。因为在典型 的调试过程中,我们可能在一个小时之内需要对代码进行多次的重编译和下 载。这样的话,对于r o m 来说,显然是不行的。而i c e 内部的模拟内存是 一个高速的r a m ,它可以映射你系统中的r o m 。有这个r a m 的话,你就 可以随意的对你软件进行修改,编译,下载,调试。 4 1 监视功能 许多i c e 对模拟器与目标机内存的访问有可编程的监控条件设置功能。 因此当一条语句试图写程序空间或者试图访问未用的地址空间就会进入中 断。 5 ) 实时跟踪 但是一个i c e 提供了最重要的性能是( 几乎是在所有调试方法中是独 一无二的) 实时跟踪。它可以在不占用运行时钟周期的情况下取得你程序 的执行情况。t r a c e 将你执行代码的简单映像存储到一个全速的大的内存数 组中。i c e 本身提供的特性和i c e 其它的辅助软件可以对这些保存的机器 码转换成汇编代码甚至是c c + + 代码,在链接表与源码的帮助下对其运行 进行分析。在i c e 复杂的触发逻辑的帮助下,很容易开始或者停止跟踪收 集运行程序的信息。t r a c e 在不影响代码运行的情况下能发现很难找到的 b u g 。在今天的强实时系统中,断点经常是不能使用的,因此t r a c e 可能是 唯一有用的调试特性。 2 1 8 2r o mm o n i f o r s 大概最老的调试工具就是r o mm o n i t o r ,r o mm o n i t o r 是运行在目标机上的 一段程序( r o m 主要指非易失性记忆体,如f l a s h ,e e p r o m 等) 。它负责监控目标 机上被调试程序的运行,通常和h o s t 端的程序一起完成对应用程序的调试。r o m m o n i t o t 预先被固化到目标机的r o m 空间,在目标机复位后首先执行的就是r o m m o n i t o r 程序,它对目标机进行一些必要的初始化,然后初始化自己的程序空间, 最后就等待h o s t 端的命令。r o mm o n i t o r 能完成被调试程序的f 载,目标机内 存和寄存器的读写,设置断点,单步执行被调试程序等功能。一些高级的r o m 第二章理论分析和基本概念 m o n i t o r 能完成代码分析( c o d ep r o f i l i n g ) ,系统分析( s y s t e mp r o f i l i n g ) , r o m 空间的写操作,以及设置各种非常复杂的断点等功能。 r o mm o n i t o r 调试方式的最大好处就是:简单、方便。还可以支持许多高级 的调试功能,并且可扩展性强,成本低廉,基本上不需要专门的调试硬件支持。 但是r o mm o n i t o r 同时也具有较多的缺点: 呤开发r o m m o n i t o r 的难度比较大。通常开发r o mm o n i t o r 是用的“c r a s ha n d b u r n ”的方式。 夺当r o mm o n i t o r 占用c p u 时,应用程序不响应外部的中断,因此不便于调试 有时间特性的程序。 夺要求目标机必须有一定的r o m 。 令在目标机c p u 不支持硬件断点( h e r d w a r eb r e a k g o i n t ) 时,r o mm o n i t o r 无法调试r o m 程序和设置数据断点( d a t ab r e a k p o i n t ,即能完成对数据读写 的监视的断点) 。 夺r o m m o n i t o r 要占用目标机一定数量的资源,如:c p u 资源、r a m 资源和通信 设备( 如:串口、网卡等) 资源。 夺在调试时r o mm o n i t o r 已经为应用程序建立了运行环境,因此在一定程度上 造成应用程序的最终运行环境和调试环境的差异,如:程序初始化部分的代 码、内存空间分配等都与最终运行环境不同。 虽然r o mm o n i t o r 有如此之多的缺点,但是人们对r o mm o n i t o r 的调试方式 仍然寄予厚望。现在r o mm o n i t o r 仍然是一种应用相当广泛的调试方式,几乎所 有的交叉调试器都采用。这篇论文设计的就是基于嵌入式的r o mm o n i t o r 上进 行的。 218 3o ng h i pd e b u g g i n g o c d ( o n c h i pd e b u g g i n g ) 是c p u 芯片提供的针对软件一种调试方法,可 以认为是c p u 提供的一种廉价的i c e 功能。因此有一种说法:o c d 的价格只有 i c e 的2 0 ,但提供了i c e8 0 的功能。最初的o c d 是一种仿r o mm o n i t o r 的结构,是将r o m m o n f f o r 的功能以微码( m i c r o c o d e ) 的形式

温馨提示

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

评论

0/150

提交评论