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

下载本文档

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

文档简介

摘要 摘要 随着嵌入式系统软件( 如嵌入式操作系统) 的发展成熟,嵌入式软件开发的重 点已经由前期的嵌入式系统软件开发转向嵌入式应用软件的开发上来。一个功能 强大的面向应用开发的任务级调试工具已经成了嵌入式开发环境中不可或缺的 一员。本论文的目标就是在当前系统级调试技术的基础上设计并实现一个面向嵌 入式应用开发的任务级调试工具。 本文首先介绍了任务级调试的相关背景知识咀及当前任务级技术的发展现 状。接着分析了断点,符号表,调试代理等基本技术,然后着重分析了任务级调 试技术,程序动态加载技术,t a r g e t s e r v e r - t a r g e t a g e n t 等关键技术。在此基础上, 提出了一个实现任务级调试工具的总体架构。最后论文对任务级调试工具的设计 进行了详细介绍。 新实现的任务级调试工具支持系统级和任务级调试,并且还支持两种调试模 式的自由切换。目标机端的任务级调试代理在嵌入式操作系统的支持下作为一个 高优先级的任务,感知和控制系统中的被调试任务,实现任务级调试功能,并通 过会话管理技术实现了对多对一调试模式的支持。目标机端的动态加载代理与主 机端韵交叉工具结合实现了程序的动态加裁功能。 本文作者在本论文中的主要工作如下: 1 调试引擎的设计和实现; 2 t a r g e t s e r v e r - t a r g e t a g e n t 的设计和实现; 3 d e b u g a g e n t 的设计和实现; 4 b f d 库从l i n u x 平台到w i n d o w s 平台的移植的工作, 关键词:交叉调试、任务级调试、t a r g e ts e r v e r 、1 打g c t a g e m 、动态加载 a b s t r a c t a b s t r a c t w i t ht h em a t u r i n go fe m b e d d e ds y s t e ms o f t w a r e 厄s s ) s u c ha se m b e d d e d o p e r a t i o ns y s t e m ,t h eh o tp o i n to fe s sd e v e l o p m e n ti sm o v i n gf r o me s st o e m b e d d e da p p l i c a t i o ns o f t w a r e ( e a s ) at a s k - l e v e ld e b u g g e rw i l lp l a yak e yr o l ei n t h ec r o s s i n gd e v e l o p i n ge n v i r o n m e n t t h ep u r p o s eo ft h i st h e s i si st od e s i g na n d i m p l e m e n tat a s k l e v e ld e b u g g e rb a s e do nt h es y s t e m l e v e ld e b u g g e rt om e e tt h e n e e d so f t h ed e v e l o p i n go f e a s i nt h ef i r s t ,t h et h e s i sd e s c r i b e st h eb a c k g r o u n da n ds t a t u so ft a s kl e v e l d e b u g g i n ga f t e rb r e a k p o i n t ,s y m b o lt a b l ea n dd e b u g g i n ga g e n tt h e o r yi n t r o d u c e d , t h i st h e s i sf o c u s e so nt h ek e yt e c h n o l o g i e si n v o l v e di nat a s k l e v e ld e b u g g i n gt o o l , i n c l u d i n gt a s kl e v e ld e b u g g i n g ,d y n a m i cl o a d i n g ,t a r g e ts e r v e ra n dt a r g e ta g e n t b a s e do nt h ed i s c u s s i n gb e f o r e ,af r a m e w o r ko fc r o s s i n gd e v e l o p i n gt o o ii sp r e s e n t e d b yt h ea u t h o r a tl a s tt h ed e t a i ld e s i g n i n go fat a s k l e v e ld e b u g g i n gt o o li ss h o w n b e f o r eu s t h et a s kd e b u g g e rs u p p o r t sb o t ht h es y s t e ml e v e ld e b u g g i n ga n dt h et a s kl e v e l d e b u g g i n g ,s , 嫡* c h i n gf r n me a c ho 世a e rf r e e l yi sa l s oa v m l a b l e a sa 娃幽洳时础 o nt h et a r g e t ,t h et a s k - l e v e ld e b u ga g e n tc o n t r o l st h ed e b u g g e dt a s k m a n yt oo n e m o d e ld e b u g g i n gi ss u p p o r t e db ys e s s i o nt e c h n o l o g y t h r o u g ht h ec o o p e r a t i o no f l o a d e ra g e n ta n dc r o s s i n ga p p l i c a t i o no nt h eh o s t ,t h ed y n a m i cl o a d i n gp r o b l e mi s s o l v e db yas l n n r tm e t h o d t h em a i nc o n t f i b u t i o n eo f t h ea u t h o ra l * et h ef o l l o w s : 1 d e s i g n i n ga n di m p l e m e n to f d e b u g g i n ge n g i n e ; 2 d e s i g n i n ga n di m p l e m e n to f 。f o r g e ts e r v e ra n dt a r g e t a g e n t ; 3 d e s i g n i n ga n di m p l e m e n to f d e b n g a g e n t ; 4 t r a n s p l a n tt h eb f dl i b r a r yf r o ml i n u xt ow i n d o w s k e y l v o r d s :c r o s sd e b u g ,t a s kl e v e ld e b u g ,t a r g e ts e r v e r ,t a r g e ta g e n t , d y n a m i cl o a d 1 1 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工 作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地 方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含 为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。 与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明 确的说明并表示谢意。 签名:生! 1日期:良仰哗f 月训日 关于论文使用授权的说明 本学位论文作者完全了解电子科技大学有关保留、使用学位论文 的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁 盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文 的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或 扫描等复制手段保存、汇编学位论文。 ( 保密的学位论文在解密后应遵守此规定) 签名:壶兰】导师签名:进 日期:一旷年f2 _ 月坷日 第一章引言 1 1 调试的概念 第一章引言 调试( d e b u g ) :按照牛津高阶词典中的解释为检测并排除( 计算机程序、机 器等) 中的故障( f i n da n dr e m o v ed e f e c t s i n ( ac o m p u t e r p r o g r a m ,m a c h i n ee t c ) ) 。 其实在软件行业中,调试这个概念的范围有了很大缩小,它只是指找到并去除代 码中的错误,并把这种对于代码的调试戏称为“捉虫”( d e b u g ) 。 如果我们把软件开发过程分为以下几个简单的阶段的话。那么调试主要存在 于软件编程和软件维护阶段。它和这两个阶段始终交织在一起,不可分割。 l 需求分析 叫软件设计| _ 叫软件编程卜l 软件维护i l 】l 】l j l _ 一 图1 1 软件开发过程 优秀程序员的优秀之处不在于他是否能编写出没有错误的代码,而是在于他 编写的代码包含的错误比别人更少( 但不是没有) 。要做到这一点,除了提高自身 的能力,苦练内功外,就是借助各种工具的帮助,提高“捉虫”能力,快速地找 到代码中的错误,并去除掉这些错误。工欲善其事,必先利其器。一个好的辅助 工具,对于我们这些程序员的重要性,可见一斑。调试工具就是众多辅助工具中 不可或缺的一员。本文中所说的调试( d e b u g ) 就是特指软件行业中的“捉虫”a 本文所说的调试工具,就是我们用来发现并找出代码中存在错误的一种工具。 1 2 交叉软件调试 软件开发有两种丌发模式,一种是主机开发模式,一种是交叉开发模式。 在现在日益信息化的社会中,计算机和网络已经渗透到了世界的每一个角 落。整个行业已经进入了后p c 时代。嵌入式系统的应用与开发成为当今计算机 系统开发的一个热点。由于嵌入式系统的多样性,专一性,数量大等特点,硬件 资源不会象台式p c 机一样丰富( 当然也没有必要) ,因此软件部分也具有很强 的硬件相关性。所以要在嵌入式设备上建立一套软件开发系统( 象p c 机上一样) 是不现实的。因此我们在进行嵌入式系统的软件开发时,一般都采用如图1 2 所 示的交叉开发模式( c r o s sd e v e l o p p i n g ) ,调试则在二者之间联机交互进行( 利用 电子科技大学硕士学位论文 交叉调试器进行交叉调试) 。 交叉开发环境下宿主机和目标机之间存在着较大的差别 从硬件上来说,宿主机和目标机的c p u 的类型,硬件参数都不同。例如: h o s t 的c p u 为i n t e lp e n t i t t r ni i i 芯片,而t a r g e t 为a r m ,端口地址分配也不同。 从软件环境上来说,在h o s t 上都有通用o s ( o p e r a t i n gs y s t e m ) 的支持( 如: w i n d o w s ,u n i xl i n u x ,等) ,而新开发的t a r g e t 一般都是裸机,没有任何的软件资 源。现有的目标机o s ( 各种实时操作系统) 只是用于对嵌入式应用的支撑而不是 用于对目标机的开发环境平台的支撑,所以它一般没有对调试功能的支持。因此, 交叉调试过程相对而言要复杂一点。 h o s t 图1 2 交叉开发模式 交叉调试一般分为下列几种调试方式:c r a s h a n db u m ,r o mm o n i t o r ,r o m e m u l a t o r ,i n c i r c u i te m u l a t o r ,o nc h i pd e b u g g i n g ,s i m u l a t o r 方式。它们一般都 采用下面的调试步骤: 1 启动目标机; 2 启动调试器; 3 调试器与目标机建立连接: 4 调试器发送下载命令,并在目标机的配合下完成被调试程序的下载; 5 调试器发送断点设置命令,或信息查询命令,进行必要的处理: 6 调试器发送目标机端继续运行命令,目标机的被调试程序开始运行; 7 目标机运行到断点后,程序停止正常运行,转入异常处理程序; 8 目标机向调试器报告异常情况; 9 调试器控制目标机的控制权,回到5 步继续执行; 1 0 否则结束本次调试过程。 2 第一章引言 1 3 任务级调试概述 任务级调试是一种能够对被调试任务进行调试,而不影响其它任务运行的调 试技术。在开发系统软件时( 如操作系统内核,i s r 等) 需要将整个系统( o s 和所有的a p p ) 停止下来,再进行观察修改变量、内存等,这种调试可称为系 统外挂式调试,简称为系统级调试( s y s t e md e b u g ) 。这种调试的特点是,一旦被 调试的程序触发调试事件,调试代理就完全占有了c p u 的执行权,直到开发者 发出操作命令让程序继续运行才退出调试代理,执行用户的程序。 系统调试的主要优点是:能够调试o s 一级的内容,包括o s 本身、i s r 、 d r i v e r s 等等,也能够对任务进行调试。 系统调试的主要缺点是:多任务环境下调试一个简单的任务,整个t a r g e t 都将被一个调试者独占,调试的代价会很高。对多人联合调试的大型t a r g e t ,无 能为力。 任务级调试是相对于系统级调试而言的,当开发应用程序时( 这时候假设基 本系统是正确的,不需要调试) ,则只需将被调试的应用程序停下来,而不用将 整个系统停止下来,这样,被调试的应用程序停止了,而没有调试的应用程序仍 然可以继续运行,这样也为同台目标机上调试多个应用提供可行之法。按照被 调试对象,我们可以称之为应用调试( 当然这种称谓并不十分准确,因为一些调 试系统中,应用调试采用了与系统调试完全相同的方式) 。因为在多任务系统中, 应用程序是以任务( 任务集) 的身份运行的,故也将这种调试称为任务级调试( t a s k d e b u g ) 。这种调试方式的一个重要特点是,一个任务因触发调试事件而被停止时, 其他任务仍然能够继续运行。 任务调试的优点是:能够单独对系统中的单个或者一组任务进行调试,不影 响o s 和其他正在运行的任务;能够支持多人同时调试一个t a r g e t 。特别是对大 型t a r g e t 系统,任务调试能够支持多人同时调试。 任务调试的缺点是:对o s 一级的内容无法进行调试。 1 4 课题综述 本文主要就是研究任务级调试在交叉调试环境下的实现技术。随着嵌入式软 件的发展,各种嵌入式操作系统的丌发同趋成熟,对于一个复杂的多任务嵌入式 应用系统而言,我们一般不会为了,一个应用而去开发一个操作系统,而是会在已 3 电子科技大学硕士学位论文 有的成熟的各种嵌入式操作系统上,直接进行嵌入式应用的开发。因此可以说现 在的嵌入式开发已经进入了嵌入式应用开发的时代。 由于嵌入式操作系统一般都是多任务操作系统,我们开发的各种应用实际上 就是一个一个在操作系统支持下在各种嵌入式平台上运行的任务。许多个任务在 操作系统的支持下,协同完成各种设计功能。在这样一种嵌入式开发的环境下, 任务级调试作为一种能够尽可能少地影响其它任务运行的情况下进行调试的技 术显得越来越重要起来。 对于一个崭新的嵌入式应用系统而言,般都要求开发者自己进行驱动程 序、各种i s r ( 中断处理) 程序的设计,各种上层应用的开发,当我们进行驱动和 i s r 开发时需要能够进行系统级的调试,在进行上层应用任务开发时,能够进行 任务级的调试。因此,研究任务级调试技术并开发一个有效地支持系统级调试和 任务级调试的交叉调试工具具有相当重要的现实意义。 当前科银京成公司的r o mm o n i t o r 交叉调试工具l a m b d a g d bv 1 3 已经实 现了系统级调试的功能,随着该公司的实时操作系统d e l t a o s 的日趋成熟和稳 定,在d e l t a o s 上的应用开发将不断丰富,对于任务级调试的需求也将随之增加。 本课题就是在科银京成的l 锄b d a g d b v l 3 系统级调试工具的基础上,以任 务级调试工具l a m b d a g d b 2 0 开发为契机,对任务级调试的一些关键技术进行 了研究分析,并设计实现一个面向嵌入式软件开发领域的同时支持系统级调试和 任务级调试的专业交叉调试工具l a m b d a g d b 2 0 。构建了一个扩展性较好的交叉 工具体系结构,有效地解决了嵌入式环境下通讯资源有限的问题。 本课题的主要任务就是: 研究任务级调试的各种关键技术,实现了一个支持系统级和任务级调试 的易用有效的交叉调试工具,并支持多对一的调试; 研究嵌入式环境下目标机端的动态加载技术,以支持任务级调试的实 现; 研究构建一个良好的交叉开发工具体系结构,解决多种交叉工具共享有 限通讯资源问题。 1 5 本文章节安排 第一章介绍了本课题的一些相关背景知识; 第二章介绍了本课题的国内外最新动态以及本课题的其它要求: 第三章深入分析了任务级调试的相关技术; 4 第一章引言 第四章细致描述了任务级调试器的总体结构、运行方式、模块间接口、系 统数据结构等部分的设计思路和实现方法; 第五章简单介绍了任务级调试器的测试; 第六章对本文进行的总结; 最后是参考文献和致谢。 5 第二章任务级调试技术的发展现状及要求 第二章任务级调试技术的发展现状及要求 2 1 国内外现状 就计算机方面的各种基础技术而言,直到现在为止,国外在很多方面还是占 有很大的优势。硬件方面:就设计能力而言国内明显不如国外,就制造能力而言, 虽然我们有很多制造工厂,但好多制造的关键技术还是掌握在外国人的手里。软 件方面,由于各种开源代码的存在,使得国内的软件水平上升得很快,但就基础 软件( 编译器,调试器,操作系统) 而言,还是存在较大的差距。 就调试而言,现在调试不再只是意味着设断点一程序暂停观察一继续这一过 程,往往还需要采用性能、跟踪、指令流收集等手段来辅助调试。能够开发出一 个对目标机影响尽可能小的调试工具是调试技术追求的目标,也是其它交叉开发 工具追求的目标。要达到这个目标,需要从硬件和软件上进行相应的研究。 硬件上,处理器厂家提供集成于片内的调试电路为高档嵌入式系统开发提供 各种非干扰式的调试手段早已是大势所趋。为了解决该领域标准化的需要,一些 处理器厂家、工具开发公司和仪器制造商于1 9 9 8 年组成了n e x u s5 0 0 1f o r u m , 这是一个旨在为嵌入式控制应用产生和定义嵌入式处理器调试接口标准的联合 组织,以前的名称是g l o b a le m b e d d e dp r o c e s s o rd e b u gi n t e r f a c es t a n d a r d c o n s o r t i u m ( 全球嵌入式处理器调试接口标准协会) 。n e x u s 现在有2 4 个成员单 位,包括创始成员m o t o r o l a 、i n f i n e o nt e c h n o l o g i e s 、日立、e t a s 和h p 等公司。 该组织首先处理的是汽车动力应用所需要的调试,现在已发展成为调试数据通 信、无线系统和其他实时嵌入式应用的通用接口。 软件工具上,系统级调试技术发展较为成熟,前文述及的各种交叉调试方式 为系统级调试提供了方便的实现手段。可以说现在的各种交叉调试工具都支持系 统级调试。国内国外都有不少支持系统级调试的工具,就软件调试技术而言,水 平比较相当。 由于嵌入式系统的广泛应用只是近几年的事情。而且要想支持任务级调试, 必须要有相对成熟的嵌入式操作系统的支持。我们很难开发出一个独立于操作系 统的任务级调试工具。在国外,支持任务级调试的调试工具一般都是嵌入式操作 系统的研制商,如w i n d r i v e r 公司的t o m a d o 集成开发环境中的调试器,捆绑于 著名嵌入式操作系统v x w o r k 。 在国内,嵌入式虽然如火如荼,但是大多都只是停留在利用第三方或丌源的 工具进行各种应用的开发的阶段。真f 自已开发出来成熟的操作系统不多。而进 7 电子科技大学硕士学位论文 行嵌入式开发环境开芨的公司就更少了,好些这方面的研究只是停留在学术或兴 趣的层面上。 系统级的调试技术在交叉调试环境下已经有了实现的产品如科银京成公司 的l a m b d a o d bv i 3 :但在任务级调试方面,则只是使用国外的相关工具,还 没有看到国内开发出任务级调试工具的相关报道。由于种种原因,我们不可能从 国外公司得到任务级调试的相关技术。但任务级调试对于我们构建完整的嵌入式 软件开发链是不可或缺的。借着科银公司强大的技术实力、该公司的l a m b d a 开 发环境和可靠的嵌入式实时操作系统d e l t a o s ,我们对任务级调试技术进行了深 入研究,实现一个国产的任务级调试工具。 2 1 1 通用操作系统环境下的应用级( 任务级) 调试 任务级调试就是在通用操作系统环境下的常用调试,如我们在w i n d o w s 下用 v c 环境下开发w i n d o w s 应用程序,并进行调试。它其实也存在程序的动态加载, 调试上下文管理等技术,也存在d e b u g e r 和被调试程序之间的通讯问题。只是由 于一般这种应用程序的调试都在同一台计算机上,而且主机端的各种资源相当丰 富,w i n d o w s ,l i n u x 等操作系统给提供了强大的支持,所以我们没有特别地在 意而已。 g d b 作为g n u 项目的一个重要成员从它诞生的一天起就受到了广大编程 人员的关注。它的强大调试功能和免费特性奠定了它在调试器领域中的霸主地 位,特别是在今天,随着嵌入式编程的发展,g d b 更是在交叉调试领域发挥了 巨大的作用。很多大型的商业公司的开发工具也是基于它的( 如t o n a d o 的调试 工具) 。而且由于嵌入式系统应用的广泛推动,g d b 也在支持交叉调试方面作了 相当多工作。这对于研究实现任务级调试有很大的帮助。本课题就是在g d b 的 基础上进行必要的改造,来实现交叉调试的各种基本功能,并进而实现任务级调 试功能的。 2 1 2t o r n a d o 的任务级调试 w i n d r i v e r 公司的嵌入式开发环境t o r n a d o 以其强大的功能,方便宜用的特 性,与优秀的操作系统v x w o r k 捆绑在一起,在嵌入式开发市场上占有相当大的 比重。 t 0 m a d o 几乎成了嵌入式系统丌发工具的代表,它提供了d e b u g e r ,w i n d v i e w 等多种工具,通过t a r g e t s e r v e r 与目标机建立连接进行通讯,支持系统级和任务 r 第二章任务级调试技术的发展现状及要求 级调试。它在整合各种交叉工具上为我们起到了很好的借鉴作用。这里不再对它 作详细的叙述,感兴趣的可以在网上查到许多相关的资料。 2 2 发展趋势及意义 从当前的嵌入式软件的发展来看,各种嵌入式应用软件的开发,越来越依赖 于各种交叉开发工具。随着各种实时操作系统技术的日趋成熟,当前的调试器一 般都要求支持任务级调试,面向应用开发的任务级调试工具将会在今后的交叉开 发环境中占据绝对的主流 任务级调试技术的研究将会弥补我国在交叉开发工具软件方面的不足,为我 国的嵌入式实时软件领域工具链的最终形成产生积极的推动作用,使国内在这一 领域的技术水平提升到一个与国际水平接近的程度。对于打破国外垄断,提高国 内软件的自给能力都是很有好处的。特别是在对大型t a r g e t 进行在线调试时,由 于不能停止目标系统上的其它任务,任务级调试显得尤其重要。 当前存在的问题:任务级调试本身功能实现的问题,如何解决通讯资源有限 的问题和如何在目标端进行程序的动态加载。 2 3l a m b d a g d b v 2 0 的特殊要求 目前l a m b d a g d b v l 3 只支持系统调试和静态加载,不支持任务级调试,不 支持动态加载。此次开发任务的目标是在l a m b d a g d b v 1 3 现有的基础上实现 任务调试和动态加载,并解决多对一调试的通讯问题。它还具有以下功能 1 基本的交叉调试功能; 这是对于选择l a m b d a o d b 的基本要求,从目前已经掌握的技术来看,这点 不存在任何问题; 2 对于流行c p u 的支持; 3 对于任务级调试的支持; 4 系统升级性应该好; 5 在多对一调试的基础上支持多种交叉工具的同时使用。如,在调试的同 时对进行覆盖测试,操作系统的信息查询,性能分析: 6 调试同志功能; 7 调试权限的管理功能。 9 第三章任务级调试技术的分析 第三章任务级谓试技术的分析 3 1 任务级调试基本技术分析 任务级调试要解决基本问题和调试要解决的基本问题是一样的,就是要在调 试器的控制下运行被调试程序,让被调试程序停在想停的地方,并能方便地通过 调试器了解被调试程序运行的各种状态和信息。只不过在任务级调试下,我们停 掉的被调试程序是以任务为单位的,其它任务,并不会因为被调试任务的停下来 而全部停下来。它们采用何种方式让被调试程序停下来和让被调试程序停在哪里 的原理是一样的。我们将在本章首先解决四个原理性的问题: 1 ,程序采取何种方式停下来? 2 程序如何继续运行? 如何进行源代码到程序地址间的映射? 程序从哪里来的到这里? 3 1 1 断点一程序停下来的关键点 3 1 1 1 断点的实现方式 要对程序进行调试,要解决的首要问题就是采取何种方式控制程序的执行, 让正在运行的程序停在想停的地方。要做到这一点并不是一件容易的事。从目前 的情况来看,调试器要让正在运行的程序停下来,通常采用断点技术,要实现断 点可以采用三种方式。 硬件方式:是指我们可以直接通过c p u 外部的硬件通道,让程序停在想停 的地方;如j t a g 方式的程序调试。因为对于硬件方式而言,它只能识别到指令 集的概念,它没有任务级的概念,它不可能意识到任务的存在。所以我们很难在 硬件方式下实现任务级调试。 纯软件方式:就是在程序中需要停下来的地方放一段代码,这一段代码的作 用就是让程序停下来,等待命令,然后继续运行。在这种方式下,断点插入是静 态的,是在编译前插入的,我们也很难在这种方式下实现任务级调试。 软硬结合方式:是指我们在硬件和软件结合的方式下产生各种断点。目前有 两种机制来产生这种断点:一种是在断点处用异常指令替换原来的指令。当程序 电子科技大学硕士学位论文 运行到异常指令处时,c p u 产生中断,让程序停下来的机制。另一种是c p u 本 身包含有断点寄存器,我们在断点寄存器中设置断点地址,当c p u 运行到断点 处时,c p u 自动产生中断,跳入中断处理程序。相比之下,第二种机制更有优 势,因为它不在保存断点指令和恢复断点指令的过程。 用断点技术实现控制程序的执行的过程一般采用如图3 - 1 所示流程。 图3 1断点程序执行流程 当c p u 运行产生了异常后,通常处理方式为操作系统获得处理一个异常的 机会,然后再由操作系统决定是否把这个异常通知给应用程序,完成相关的操作。 而当程序处在调试方式下时,为了控制程序的执行,取而代之的方法是:异常发 生时调试器被首先通知,然后由调试器决定是否把异常通知给操作系统,再由操 作系统决定是否把异常通知给应用程序。 在这罩所谓的异常,覆盖了很广范围的事件。包括“非法指令”、“用户中断”、 “浮点数溢出”等等。它还包括一些特殊事件如“断点命中”、“单步完成”。这 些异常将通知调试器一些感兴趣的事发生了,在未进行事件点迁移( 这个概念将 在后面的章节中叙述) 的系统级调试情况下,目标机只是向调试器端报告异常发 生时的c p u 的p c 指针即可,而主机端的调试引擎则根据这个地址查表获得哪 种事件发生,并产生事件,驱动调试器的后续操作。在任务级调试下,由于事件 点的迁移,则事件点的判断和产生在目标机端进行,并作出一些预处理后,通知 主机端的调试引擎,作相应的后续处理。 因此我们可以看到,调试器实际上只是在应用程序中插入很多的断点,当程 1 2 第三章任务级调试技术的分析 序运行后,调试器是不能控制的,只能通过事先指定的这些断点被命中后,产生 各种调试事件,再来驱动我们的调试器工作。这种“事件驱动”的调试已经扩展 并包括很多非异常事件,其中一些对调试效率还是至关重要的。 3 1 1 2 断点的分类 断点可以说是作为我们调试的最为基本的一个技术。我们许多的调试功能的 实现算法都是在它之上才能实现的。下面介绍几种断点: 普通断点:平时我们调试时说的在哪一行插入一个断点,这实际上说的就是 普通断点,这是我们有意插入的断点,它是我们平常意识到的一类断点。 临时断点:它可以被理解为仅触发一次的断点,被用来实现诸如“运行到 m a i n ”或“运行到这罩”的算法。“运行到m a i n ”用在被调试程序启动并快速执 行所有启动代码并停在从程序员角度看的程序开始处一m a i n 例程。“运行到这里” 允许用户指定源代码中他期望运行到的地方,然后被调试程序快速执行到该点。 临时断点的这种例子其实就是隐式的设置和取消断点,临时断点触发后就会被删 除。典型的情况是,断点的临时特性是断点的一种属性,其他描述方式同其他断 点一样。所以在程序停下来后需要搜索所有断点并清除临时断点。 内部断点:如同临时断点一样,内部断点可被认为是断点对象的一个相关属 性。内部断点对用户而言是不可见的,但对调试器而言是正确处理很多内部算法 的关键。这些断点是调试器自己设置的。基本的源码级单步算法需要内部断点和 “全速运行到的优化单步速度替换算法”的内部断点的结合,如同机器单步指令 到成百上千指令的比较。这对源码语句的跳步执行是至关重要的。 3 1 1 3 断点的基本操作 对于断点我们列出以下一些重要的基本操作。 断点设置:插入断点,并设置断点的相关属性。 断点删除:删除指定的断点。 断点查找:在断点表中查找指定的断点。 断点确认:当异常产后,确认是不是断点命中。 3 1 2 断点数据结构程序继续运行的基础 对于纯硬件方和纯软件方式而言的,程序只需要硬件上的继续执行就行了。 1 3 电子科技大学硕士学位论文 对于软硬结合方式而言设计一个好的断点数据结构,存储断点处程序的各种信 息,对于调试恢复运行和各种调试功能的实现起着至关重要的作用。当程序停在 断点处后,我们要把当前的程序运行的所有环境保存在相应的数据结构中,当程 序要从断点处的继续运行时,就利用这个数据结构中保存的数据,恢复程序的运 行环境。其实这里的环境就是c p u 发生异常时各个寄存器的值和其它一些相关 信息。 当我们的程序运行到断点处,产生异常,c p u 就会中断现在的程序流程, 跳到异常处理程序中执行,异常处理程序会把当前的c p u 的现场和各寄存器的 数值作为断点信息保留下来。然后再进行相应的各种操作。如通知调试器断点命 中,产生各种调试事件,驱动调试器工作。 当程序要从断点处恢复运行时,它会把原来被替换掉的指令恢复回来,然后 把保存在断点信息中的各个寄存器的值恢复到程序发生异常前条指令时的状 态,然后把c p u 的p c 指针恢复到断点的地址处,让程序在断点处继续运行起 来。 3 1 3 符号表一实现代码到可执行文件的桥梁 源码级的调试对于现在的调试而言是相当重要的,现在的嵌入式开发一般都 用c 语言,只有少部分代码( 与硬件联系密切的) 才会采用汇编语言,当我们 在调试时,如果只能从指令级进行调试,那难度是相当大的。因此我们现在的调 试一般都是从源码视角进行调试的。 要实现源码级的调试首先要解决的问题就是如何完成从源文件到可执行文 件的映射。符号表技术就是为了解决这一关键问题的。符号表记录了源文件中的 各种符号在目标文件或可执行文件中对应的地址信息。如,我们可以通过符号表 查找得到源文件中的一行代码,对应到可执行文件中地址0 x a a a a a 到地址 0 x b b b b b 的那几条指令。 要实现符号表,这需要编译器的支持。当程序在进行编译时,编译器就把 各种相关的符号信息添加到了符号表中,这样便于我们能够进行相关信息的查询 操作。 当利用g n u 系工具工具进行程序开发时,首先就是编写程序,然后利用一g 选项进行编译,这样生成的目标文件就会带有各种调试信息( 包括符号表) ,在我 们链接时,这些符号信息也会转移到我们生成的可执行文件的符号表中,当进行 调试时,我们就可以利用这些符号信息完成目标文件到源码文件的映射,实现源 码级的调试。 1 4 第三章任务级调试技术的分析 在任务级调试器中,有两个部分需要对各种符号的进行处理,即调试部分和 动态加载。因此,在这里我们有必要介绍一下符号表的相关操作技术。 3 1 3 1 符号表的处理( b f d 库) b f d 是b i n a r y f i l ed e s c r i p t i o n 的缩写,它是g n u 工具链使用的一个通用二 进制文件操作库,当汇编器、链接器、调试器等工具对各种二进制文件( 包括 o b j ,e x e ,o u t ,e l f 等文件) 进行读写操作时,通过它会带来极大的方便。我们在这里 对b f d 库进行一些必要的介绍。 3 1 3 1 1b f d 库原理 b f d 总体上有两个层次:b f d 前端和b f d 后端。b f d 只有一个前端,它向 用户提供与具体目标格式无关的使用接口;从b f d 后端角度看,b f d 前端还决 定了何时调用哪个后端的哪个例程。通常把b f d 前端提供的与具体后端无关的 数据结构和操作接口称为“b f d 权威数据结构接口”。b f d 可有多个后端,每 个后端提供对实际文件格式的支持,提供一个供b f d 前端调用的操作集合。因 为效率的关系,b f d 后端也将保存自身使用的一些数据,但主要是挂接在b f d 前端权威数据结构中。 使用b f d ,只需要在源代码中包含”b f d h ”头文件即可,在链接时使用” l i b b f d a ”。在b f d 的文档中,将b f d 的指针类型称为b f d ,将其实例称为a b f d 。 为了减少名字空间的污染,所有的b f d 的操作都以”b f d ”打头。 从应用程序使用的角度看,对一个目标文件,b f d 描述了下列信息: 1 一个文件头 2 多个包含原始数据( r a wd a t a ) 的s e c t i o n 3 一个重定位( r e l o c a t i o n ) 集合 4 一些符号信息 b f d 从操作方向上可分为输出b f d ( o u t p u tb f d ) 和输入b f d ( i n p u tb f d ) 。 输出b f d 用于创建和修改目标文件内容,而输入b f d 则主要在读取目标文件信 息。由于我们主要是使用符号表,所以在这里只是重点介绍一下输入b f d ,对 输出b f d ,也有提及但不深入。 由于b f d 的特殊性,b f d 不得不自定义一堆基本数据类型。它们是: 1 布尔类型:b o o l e a n t y p e d e f e n u m b f db o o l e a n f a l s e ,t r u e b o o l e a n ; 】5 电子科技大学硕士学位论文 2 文件的偏移指针类型:f i l e _ p t r t y p e d e ft o n gi m f i l e p t r ; 3 机器标志字:f l a g w o r d t y p e d e f u n s i g n e d i n tf l a g w o r d ; 4 ,字节类型:b f d _ b y t c t y p e d e fu n s i g n e dc h a rb f d _ b y t e ; 5 符号索引类型:s y m i n d e x t y p e d e fu n s i g n e dl o n gb f d _ v m a ; 6 虚拟内存地址:b f dv m a b f d 3 2 : t y p e d e f u n s i g n e dl o n gb f d _ v m a ; b f d 6 4 : t y p e d e fb f d 。h o s t u 6 4 b i tb d fv m a ; 7 有符号的虚拟内存地址:b f d s i g n e d _ v m a b f d 3 2 : t y p e d e fs i g n e dl o n gb f d _ s i g n e d _ v m a ; b f d 6 4 : t y p d e fb f d _ h o s t 6 4 b i tb f d _ s i g n e d _ v m a ; 8 符号值类型:s y m v a l u e b f d 3 2 : t y p e d e f u n s i g n e dl o n gs y m v a l u e ; b f d 6 4 : t y p e d e f b f d _ h o s t u 一6 4 一b i t s y m v a l u e ; 9 目标机字类型:b f d s i z e _ t y p e b f d 3 2 : t y p e d e f u n s i g n e dl o n g b f ds i z e t y p e ; b f d 6 4 : t y p e d e fb f d h o s t + u 6 4 b i tb f d s i z et y p e ; 其中,b f d h o s t 一6 4 一b i t 和b f dh o s tu 一6 4 一b i t 定义如下( 当然,也不 需要我做过多解释) 第三章任务级调试技术的分析 3 1 3 1 2b f l ) 的权威数据结构 输入n d 的 图3 - 2b f d 库内部数据结构关系图 b f d 的权威数据结构主要包括b f d ( 即s t r u c tb f d ) ,a s e c t o i n ( 即s t r u c ts e c ) 1 7 电子科技大学硕士学位论文 a s y m b o l ( 即s t r u c ts y m b o l _ c a c h e _ e n t r y ) ,a r e l e n t ( 即s t r u c tr e l o cc a c h ee n t r y ) ,a l e m ( 即s t r u c tl i n n o _ c h a c h e _ e m r y ) 。它们的用途及含义如下: b f d :一个b f d 对应于一个打开的目标文件。 a s e c t i o n :一个a s e c t i o n 对应于目标文件的中一个s e c t i o n 。一个b f d 中有目标 文件的s e c t i o n 列表,并以数组的方式组织,我将其成为s e c f i o n 表。 a r e l e n t :一个a r e l e n t 对应于一个重定位项。某些s e c t i o n 有重定位表。如前 所述,本文不研究它。 a s y m b o h 一个a s y m b o l 对应于一个b f d 符号。需要注意的是,输入b f d 并不包含b f d 符号表,而输出b f d 的符号表的存储空间也是应用程序指定的; 这里的b f d 符号并不是我们平时所说的调试符号,二者有区别。a l e n t :行号记 录。某些s e c t i o n 有自己的行号记录列表。 3 1 3 121 数据结构间的关系 b f d 库对于各种目标文件的操作是基于内部的一个复杂的数据结构如图3 2 所示,几乎所有的操作都是在这个数据结构之上的。 它反映了b f d 的权威数据结构之间的整体关系,关于每个权威数据结构的 具体内容下面会做较详细的解释。 3 1 3 1 2 2b f d 结构 b f d ( s t r u c t b f d ) 是b f d 库同应用程序交互的一个最基本的结构。它由b f d 库的相应操作而创建。只有在极少数情况下,应用程序需要直接使用其数据成员。 由于应用程序打开目标文件的目的不同,为修改目标文件或创建目标文件而打开 的b f d 称为输出b f d ,而仅为读取信息( 如调试器) 而打开的目标文件的b f d 称 为输入b f d 。二者在数据成员上有少许差异。 黼黧溺露燮燮鬻黼麟黼黼戮黻戮鞘麟鬻 1c o n s tc h a r + f i l e n a m e 应用程序使用b f d 打开的目标文件名 2c o n s ts t r u c tt a r g e tj u m pt a b l e 的指针 b f dt a r g e t x v e c ( 这是b f d 后端挂接自己的函数操作表的地 方) 3p t r1 0 s t r e a m 使用f o p e n 打开目标文件的指针 当b f d i n m e m o r y 标志设

温馨提示

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

评论

0/150

提交评论