




已阅读5页,还剩70页未读, 继续免费阅读
(计算机软件与理论专业论文)基于codewarrior集成开发环境的调试器原理及实现.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电子科技大学硕士论文 摘要 随着计算机编程语言的飞速发展,软件包的复杂度和容量不断增加。在大型 软件开发过程中,对调试器的要求越来越高。这些需求不仅要求调试器提供给用户 高效,直观,易用的调试功能和环境,还需要调试器提供优化代码调试等高级调试 功能。另外,目前各种新的嵌入式平台层出不穷,与其配套的调试开发环境的需求 随之增加。本文提出的调试框架能满足调试器高效,可配置,界面统一的需求。 本文首先阐述了调试器设计的基本原理,调试器的类型,调试器的结构等基 本概念。然后介绍了断点设置,单步跟踪,执行控制和符号表读写的原理;以及硬 件和操作系统对跟踪调试的支持。最后,本文着重以m e t r o w e r k s 公司的i d e 环境 为例,介绍了一个灵活高效可扩展的调试器框架的设计,实现和增强。并且以在多 个平台上调试器的实现为例,以类图和序列图的方式介绍了调试类的派生关系及逻 辑关系。 本文在讨论调试器的原理以及技术基础上,介绍了c o d e w a r r i o r 这种高性能 的可扩展的集成开发环境的架构,详细探讨了在c o d e w a r r i o r 的架构下以c o m 为基 础插件的设计与实现结合具体的工程实现,本文综述了c o d e w a r r i o r 调试器实现 的特点和原理,分析了调试器模块和集成核心之间交互的方式方法,讨论了调试核 心逻辑的实现,并在最后阐述了一点对进一步工作的想法 关键词:调试器,断点,调用堆栈 电子科技大学硕士论文 a b s t r a c t w i t ht h ed e v e l o p m e n to ft h ec o m p u t e rp r o g r a m m i n gl a n g u a g e ,t h ec o m p l e x i t ya n ds i z e o ft h es o f t w a r ep a c k a g ea r ec o n t i n u o u s l yi n c r e a s i n g i nt h el a r g es c a l es o f t w a r e d e v e l o p m e n tp r o j e c t ,m o r ea n dm o r er e q u i r e m e n t s f o rd e b u g g e rc o m eo u t t h e s e r e q u i r e m e n t sn o to n l yr e q u i r et h ed e b u g g e rt op r o v i d et h ee f f i c i e n t ,e a s y t o u s e a n d p o w e r f u ld e b u g g i n ge n v i r o n m e n tt ot h ee n du s e r ,a l s or e q u i r et h ed e b u g g e rt os u p p o r t s o m eh i g h t i e rf e a t u r e s ,s u c ha so p t i m i z e dc o d ed e b u g g e r ,e t c t h i st h e s i sd e s c r i b e st h ec o n c e p to fd e b u g g e rd e s i g na n di m p l e m e n t a t i o n i tc o v e r st h e t h e o r ya n da l g o r i t h mo fh o w t oi m p l e m e n tt h eb r e a k p o i n t ,s i n g l es t e p ,e x e c u t i o nc o n t r o l a n ds y m b o l i ca c c e s s t h eg e n e r a lh a r d w a r ea n do p e r a t i o ns y s t e ms u p p o r ta r eb r i e f l y i n t r o d u c e di no r d e rt ow e l le x p l a i nt h em e c h a n i s mo fd e b u g g i n gp r o c e s s a sa ne x a m p l e ,t h em e t r o w e r k sc o d e w a r r i o ri n t e g r a t e dd e v e l o p m e n te n v i r o n m e n t ,o n w h i c ht h ea u t h o rw o r k e df o rm o r et h a nt w oy e a r s ,i sa n a l y z e dt oi l l u s t r a t et h ed e s i g no f t h ed e b u g g e r i nt h el a t e rc h a p t e r ,ie x p l a i nt h ed e s i g no ft h ed e b u g g e rf r a m e w o r kw h i c h c o n s i s t so ft h ed e b u g g e re n g i n ea n dd e b u g g e rp l u g i n a l lt h ek e yf e a t u r e sw i l lb e i l l u s t r a t e da ss e q u e n c ed i a g r a mo rc l a s sd i a g r a mi nt h i st h e s i s k e yw o r d s :d e b u g g e r , b r e a k p o i n t ,c a l l s t a c k 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工 作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地 方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含 为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。 与我一同工作的同志对本研究所做的任何贡献均己在论文中作了明 确的说明并表示谢意。 签名:咕;文日期:功。f 年细月,口日 关于论文使用授权的说明 本学位论文作者完全了解电子科技大学有关保留、使用学位论文 的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁 盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文 的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或 扫描等复制手段保存、汇编学位论文。 ( 保密的学位论文在解密后应遵守此规定) 签名:赴导师签名:逢遂签名:自这 导师签名: 峰垣 日期:刃o 年d 月1 0 日 电子科技大学硕士论文 1 1 背景 第一章调试器及其技术简介 随着计算机技术的发展,跟踪调试器( d e b u g g e r ) 已成为软件开发的重要工 具。由于跟踪调试器和硬件紧密相关,和操作系统结合紧密,其开发设计因而比较 复杂和困难。现代操作系统和硬件提供了越来越强和越来越多的功能和设备来支持 查错和意外处理( e x c e p t i o nh a n d l e ) ,加之高级编程语言的飞速发展, 就要求 跟踪调试器能更加有效的利用操作系统接口和硬件功能,向用户提供高效,便利和 功能强大的开发调试差错能力。 严格的说,跟踪调试器是软件开发人员在开发过程中定位,去除软件错误的 工具。从工作性质来看,跟踪调试器大致分为两类:操作系统内核集成调试器和源 代码符号调试器。 操作系统内核集成调试器主要用于在真实运行环境中实时调试操作系统及运 行于其上的应用程序,例如s o f ti c e s o f ti n c i r c u i te m u l a t o r :软件片上仿 真器,就可以在操作系统运行时实时陷入,进行现场调试。 源代码符号调试器用于高级语言的排错,查错。流行的源代码符号调试器有 g n ug d b ,b o r l a n dt u r b od e b u g g e r 及各种集成开发环境例如v i s u a lc + + ,c + + b u i l d e r 内嵌的源代码符号调试器。本文要介绍的就是这类调试器的实现技术。 源代码符号调试器设计的主要功能模块有: 消息驱动框架 被调试程序的执行控制模块 断点及单步的实现 程序上下文的读取和写入 符号表的访问 消息驱动框架 d e b u g g e r 的实现是基于消息驱动的。被调试程序( d e b u g g e e ) 通过操作系 统,串口或t c p i p 等网络协议把自己的状态通知d e b u g g e r ;d e b u g g e r 收到消息后 电子科技大学硕士论文 根据消息类型或读取调试程序当前执行上下文并显示给用户,或通过用户改变调试 程序上下文,例如寄存器,变量,堆栈的内容,实现跟踪调试的功能。 d e b u g g e r 需要捕获的消息很多,主要消息的类型有: d e b u g g e e 进程创建退出消息 d e b u g g e e 线程创建退出消息 d e b u g g e e 模块加载卸载消息 d e b u g g e ee x c e p t i o n 例外消息 e x c e p t i o n 消息是d e b u g g e r 实现的关键。首先d e b u g g e r 的首要目的就是捕 捉d e b u g g e e 执行中的错误,例如内存访问错,除零等操作都会产生e x c e p t i o n 其次,e x c e p t i o n 可以被用于实现d e b u g g e r 的功能。例如使用操作系统内存写指 令插入操作系统t r a p 指令到d e b u g g e e 的代码段中,可以实现断点( b r e a k p o i n t ) 功能。 总之,消息驱动是实现d e b u g g e r 的核心,几乎所有的调试功能,都是利用消 息处理实现的。因而,设计一个灵活高效而可扩展的消息驱动框架是d e b u g g e r 设 计的挑战。本文将介绍作者在m e t r o w e r k sc o d e w a r r i o ri d e 环境中实现的 d e b u g g e r 框架。 被调试程序的执行控制模块 在调试过程中,d e b u g g e e 的执行必须在d e b u g g e r 的控制下进行,当 d e b u g g e e 由于某种原因中断执行,控制权将回到d e b u g g e r 。 现代操作系统多提供了进程产生子进程的系统调用;d e b u g g e r 常常使用这种 系统调用来实现对d e b u g g e e 的控制。对于通过p c 机的串口协议或者网络协议对嵌 入式系统应用程序进行调试的d e b u g g e r 来说,通常在嵌入式系统硬件内存中驻留 了一段系统程序来实现类似的功能。 断点及单步的实现 断点是d e b u g g e r 核心功能之一。被调试程序执行的控制逻辑,主要是通过各 种内部使用的特殊断点来控制程序的执行来实现的。 2 电子科技大学硕士沦文 断点本身的实现有许多方法,硬件系统通常提供t r a p 一陷入指令,使得用 户态程序能陷入内核。例如x 8 6 系统的i n t3 中断指令。当执行此类指令时,操 作系统会通知注册为d e b u g g e r 的应用程序陷入的发生。 断点的实现多是将进程实 体代码段中的正常指令替换为t r a p 指令。 在系统没有提供t r a p 指令的情况下,还可以使用非法指令例如除以零,来实 现断点功能。 单步功能( s i n g l e s t e p ) 指的是控制程序以每一条指令为单位执行的过程。 其中指令可以是汇编指令或高级语言语句。单步功能常用的实现方法是在被调试程 序下一条即将被执行的语句地址上( p c + i ) 设置临时断点,并在执行此地址单元指 令后去掉此断点。这样一来被调试程序将在此临时断点上中断,由此实现了单步功 能。 有的处理器本身提供了单步执行的功能,但是是以机器指令为单位的单步。 这种功能只能用于实现汇编级的单步调试,因为高级语言的语句多由几十上百条机 器语言构成,若处理器在机器语言级的单步状态下,d e b u g g e r 的效率将及其底 下。 程序执行上下文的读取和写入 在被调试程序中断,d e b u g g e r 取得控制权时,需要在u i 上为用户提供当前被 调试程序的上下文信息,包括程序调用栈,寄存器等。并且需要提供用户修改上下 文信息的功能。 符号表访问 数据与指令同样是构成程序的根本。数据类型繁多,不同的类型处理起来有 所不同,其基本原理是由数据名找到存放该数据的地址,再从地址中取出数据的 值。关键在于找到名与地址的映射关系。这些信息可从d e b u g ,s y m t a b 等节中得 到。全局变量一般可得到直接的地址信息,而局部变量采用堆栈方式存放在内存 中,需根据从d e b u g 中得到的该变量在堆栈中的位置信息来确定地址。采用表结 构来管理变量,将每个变量的名、地址等信息登记在表中,将对数据值的操作转化 为对相应地址的内存单元操作,如查看变量即为读取该变量所在内存单元的内容。 3 电子科技大学硕士论文 1 2c o d e w a r r i o r 环境 本文介绍的调试器是基于于m e t r o w e r k s 公司的集成开发工具c o d e w a r r i o r 的i d e 开发环境的。 c o d e w a r r i o ri d e 使用c o m 技术实现了灵活的插件( d r o p i np l u g i n ) 功 能,在i d e 环境下,所有编译器,连接器,调试器等都是i d e 的插件。i d e 规定了 编译器,调试器,连接器,符号表的标准接口协议,使得不同语言,不同平台( 对 嵌入式系统交叉编译调试而言) 的编译器,连接器,调试器能够在同一i d e 中使 用。只需简单的将插件放入i d e 规定的目录下。 。 同时c o d e w a r r i o r 还在各种版本的u n i x 系统和m a c 系统西下实现c o m 的支 持,使得源代码可以实现大部分的平台无关。c o d e w a r r i o r 已成为m a c 系统上最流 行的集成开发环境和j a v a 及嵌入式开发调式的强大工具。 1 3 术语及其解释 d e b u g g e r d e b u g g e e b r e a k p o i n t w a t c h p o i n t c a l ls t a c k c o n t e x t c o d e w a r r i o r i d e a p i s i n g l es t e p d w a r f e l f 调试器 被调试程序 断点 数据断点 程序调用栈 上下文 m e t r o w e r k s 公司产品 集成开发环境 应用程序接口 单步执行 d e b u gw it ha t t ri b u t er e c o d ef o r m a t e x e c u t a b l el i b r a r yf o r m a t 4 电子科技大学硕士论文 2 1 调试器的结构 第二章调试器关键技术 调试器的系统结构如图图2 1 1 所示 图2 卜1 按照调试程序运行平台和被调试平台的关系来分,d e b u g g e r 可简单分为两 类:h o s t h o s td e b u g g e r 和h o s t t a r g e td e b u g g e r 。 5 3 h o s t h o s td e b u g g e r 是指d e b u g g e r 和d e b u g g e e 运行在同一平台上,例如 g d b 等u n i x 平台的调试工具,就是在u n i x 平台上,通过u n i x 操作系统提供的 d e b u ga p i 对u n i x 平台的应用程序进行调试。 5 电子科技大学硕士论文 h o s t t a r g e t 调试器则是用户在p c ( h o s t ) 上运行d e b u g g e r ,d e b u g g e r 通过 串口,网络协议或目标板上提供的调试设备,和运行于目标板上的应用程序通信, 并使用应用层的调试协议进行调试。 h o s t t a r g e t 调试又称作交叉调试。交叉调试器则是一种分布式的系统,交叉 调试器自身运行在宿主机端,而被调试的可执行代码运行在目标机端,宿主机和目 标机的体系结构和操作系统可能完全不同,调试器要直接控制代码的执行是非常困 难的事。因此,宿主机和目标机必须使用某种通信协议进行通信,调试程序使用这 种通信协议把调试命令从宿主机发给目标机;目标机端根据宿主机的调试命令执行 相应的调试功能,并且把调试结果送回宿主机端显示出来。这种调试技术称为远程 调试。 目前,远程调试技术主要有两种实现方式。 第一种称为片上调试( o nc h i pd e b u g g i n g ) ,片上调试是在处理器内部嵌入额 外的控制模块,当满足了一定的触发条件时进入某种特殊状态。在该状态下,被调 试程序停止运行,主机的调试器可以通过处理器外部特设的通信接口访问各种资源 ( 寄存器、存储器等) 并执行指令。为了实现宿主机通信端1 :3 与目标机调试通信接口 各引脚信号的匹配,二者通过一块简单的信号转换电路板连接。内嵌的控制模块以 基于微码的监控器( m i c r o c o d em o n i t o r ) 或纯硬件资源的形式存在,包括一些提供给 用户的接口( 如断点寄存器等) ,如图2 卜2 所示。具体产品有m o t o r o l ac p u l 6 、 c p u 3 2 、c o l d f i r e 系列的b d m ( b a c k g r o u n dd e b u gm o d e ) ,m o t o r o l ap o w e r p c 5 x x 、8 x x 系列的e p b d m ( e m b e d d e dp o w e r p cb a c k g r o u n dd e b u gm o d e ) , i b m 、t i 的j t a g ( j o i n tt e s ta c t i o nd e b u g ,i e e e 标准) ,还有o n c e 、m p s d 等等。这种调试模式的优势在于接近底层硬件,可以用来调试系统软件,例如调试 嵌入式操作系统的内核。但是这种方式也有些不足,比如这种调试方式只限于支持 片上调试的c p u 。 6 电子科技大学硕士论文 图2 1 2 第二种远程调试技术是通过在目标机端运行的监控程序来完成调试操作。宿 主机端的调试程序把调试命令通过通讯协议发给运行在目标机端的监控程序,监控 程序接受调试程序的命令并翻译成可以在目标机端执行的命令并且执行,从而完成 调试功能。 m o t o r o l a 公司的应用调试内核及调试协议m e t r o t r k m e t r o w e r k st a r g e t r e s i d e n tk e r n e l 就属于第二种,它是一个通用的监控程序的框架,可以适应于各 种目标板。这种方式成本低,不需要特殊硬件的支持。但是由于内存中驻留了调试 监控程序,其调试环境和真实的运行环境有区别;其次运行速度和内存大小会受监 控程序的影响。 a p p l i c a t i o n s j f d e b u g g e r r e s i d e n tk e r r l e r l 1 f1 t u调试协议 h o s t o s t a r g e to s 1 i 串口、并e l 或以太网 图2 1 3 7 电子科技大学硕士论文 通用的桌面操作系统与嵌入式操作系统在调试环境上存在明显的差别。前 者,调试器与被调试的程序往往是运行在同一台机器、相同的操作系统上的两个进 程,调试器进程通过操作系统专门提供的调用接口( u n i x 系统的p t r a c e 调用) 控 制、访问被调试进程。后者( 又称为远程调试) ,为了向系统开发人员提供灵活、 方便的调试界面,调试器还是运行于通用桌面操作系统的应用程序,被调试的程序 则运行于基于特定硬件平台的嵌入式操作系统( 目标操作系统) 。远程调试主要是 通过在被调试程序( 目标操作系统) 中加入的通信模块和调试器进行交互,从而达 到调试的目的( 如图2 卜3 所示) 。这种通信模块通常叫做调试代理( d e b u g g i n g a g e n t ) 或桩( d e b u g g i n gs t u b ) 。它们就是在目标机上运行的小程序,负责执行调 试器的命令去读写内存、查询和设置寄存器的值、运行被调试的程序,另外还会告 诉调试器一些异常( e x c e p t i o n ) 。调试器和目标操作系统是通过指定通信端口( 网 络、串口等) 遵循远程调试协议进行通信的。 通常在一个远程调试会话期中会发生如下一系列动作: 1 ) 调试器向调试目标机发送一系列写在内存里的指令,这些指令把要调 试的应用程序从宿主机传到目标机上。 2 ) 然后,调试器通知目标机跳到内存中应用程序的开始位置,然后设置 断点、运行程序。 3 ) 被调试的应用程序遇到断点,调式代理( d e b u g g i n ga g e n t ) 通知调试器 应用程序已经暂停,现在正在等待下一步的指令。 4 ) 在此期间,调试器可以查看内存来确定寄存器和变量的值,以及向用 户显示被调试程序产生了哪类异常。 5 ) 接下来,调试器可以发出后续的调试命令,如增加删除断点、单步、 继续执行、跳入、跳出等。 6 ) 最后程序正常终止或程序出现异常后由调试器强制终止。 2 1 1 用户界面 m e t r o w e r k sc o d e w a r r i o ri d ed e b u g g e r 基本用户界面如下图所示: 8 电于科技大学硕士论文 项目视图显示了当前打开的项目,用户可以在此视图内执行编译,链接,修 改项目选项,添加删除文件等常用操作。 2 1 1 1 源代码视图 源代码视图是程序员调试时使用的最主要的环境。它使用户感觉到,源代码 在调试环境中直接的在执行。源代码视图在不同的状态下有不同的功能:程序运 行状态下,作为控制程序执行的环境,用户可以使用设置断点,单步执行等功能; 在非程序运行状态下,其功能为程序代码编辑器。如下图所示。 9 电子科技大学硕士论文 图2 卜5 2 1 1 2 调用栈视图 调用栈视图为用户展示了函数调用堆栈的回溯。调用栈是线程相关的:每一 个线程都有一个调用栈。典型的函数调用栈是向下增长的,在调用栈视图中,c a l l s t a c k 也将以向下增长的方式显示。 调用栈中的每一项表示一个s t a c kf r a m e ( 栈帧) ,又称为活动记录;通常阱 函数名的形式显示。在没有符号表信息时,s t a c kf r a m e 以函数地址的形式表示。 如下图所示。 1 0 电子科技大学硕士论文 2 1 1 3 断点视图 断点视图支持各类的断点的修改和显示。 下图所示的c o d e w a r r i o r 环境中支持r i c h b r e a k p o i n t 类型,包括: b r e a k p o i n t 一般的断点类型 w a t c h p o i n t l o r g p o i n t p a u s ep o i n t s c r i p tp o i n t s o u n dp o i n t 数据断点类型 记录日志断点 遇到时暂停执行被执行程序足够长时间以刷新调试器显示 触发时可执行知道的程序 触发时发出指定的声音 电子科技大学硕士论文 2 1 1 4 寄存器视图 图2 1 7 下图是w i n d o w sd e b u g g e r 的寄存器视图,该视图显示了各寄存器组和寄存器 组中的寄存器及其值。同时用户可以在v a l u e - - n 中修改寄存器的内容。 注意所有寄存器组的父节点是具体的线程,并且以线程i d 标识。这是由于寄 存器现场信息是线程相关的。 寄存器视图功能 显示寄存器的值 1 2 电子科技大学硕士论文 不能显示协处理器寄存器 可以编辑寄存器的值 图2 1 8 2 1 1 5 变量视图 变量视图如下所示。我们可以选择显示全局变量或者局部变量的值。并且变 量值的显示可以由不同的方式,例如各种进制,按字符串等方式。 变量视图功能 以各种格式( b y t e ,w o r d ,d o u b l e ,等) 显示 可以手工编辑内存 可以向窗口拖变量一转跳到变量的地址 标明内存的变化 1 3 电子科技大学硕士论文 2 1 2 n 试器内核模块 在图2 1 所示的调试器内核实现了对用户界面所有视图功能的支持。进程和 线程控制就是在这里实现的。用户想要调试的应用程序对于操作系统来说,就是进 程。 调试器可以生成一个子进程,也可以附加( a t t a c h ) 到一个已有的进程。在 这两种情况下,这个进程就是被调试程序的执行体。在调试结束时,调试器要终止 被调试进程的运行或者解开和被调试程序的附加关系。 除此之外,调试器还要负责符号表的访问。通常符号表是用户想要调试的应 用程序的执行文件的一部分。调试器必须查询符号表来实现源程序代码和执行的二 进制字节代码地址之间的映射。这种映射机制还用于提供设置断点的辅助功能。符 号表还提供了高级语言变量的信息,使得调试器可以将源代码级的变量和数据结构 映射到一个被调试程序执行体的内存空间地址。与此相关的还有编译器提供的类型 1 4 电子科技大学硕士论文 信息( t y p ei n f o r m a t i o n ) ,调试器可以用来正确解释被调试程序进程空间的内存 中的信息。 使用符号表中的源代码信息,调试器内核的执行控制模块( e x e c u t i o n c o n t r 0 1 ) 可以使被调试程序的执行以源代码为单位执行的形式呈现给用户( 实际 是以机器指令为单位执行) 。 语言解析模块处理高级语言表达式的解析。通常该模块需要访问编译器的解 析器( p a r s e r ) 来解析文本表达式;它必须访问符号表来定位变量地址;读出被调 试程序内存来得到这些变量的值,并写回该地址以实现用户对程序变量的修改等 等。 2 2 现代处理器和操作系统对跟踪调试的支持 调试器控制被调试程序运行的能力依赖于处理器硬件支持和操作系统或者驻 留程序的调试接口的支持。这里我们将讨论硬件和操作系统对调试的支持。 为了实现调试,调试器对底层硬件的需求是,至少要支持以下的功能: 断点的实现一当被调试程序执行到指定的地址,执行进程将挂起。简单的 实现支持是提供非法指令,将其写入被调试程序的指定地址。 中断陷入一通知操作系统和调试器,产生关于某进程特定的消息的能力。 当中断发生时,读写包括指令寄存器p c 在内的硬件寄存器的能力。 某些硬件还提供了更多更强大的调试支持的功能,但上述硬件功能已经能实现 大部份的调试功能。例如有的处理器提供了单步执行功能,它完全能由断点功能来 实现。 2 2 1 处理器硬件对调试功能的支持机制 我们将在此从以下调试功能的角度来讨论硬件对调试的支持: 断点 单步 错误侦测 数据断点 1 5 电子科技大学硕士论文 2 2 1 _ 1 断点 断点通常是使用特殊的机器指令导致陷入操作系统内核,并且可以通知在操 作系统中注册为调试器的特殊的应用程序。 在指令长度为变长的硬件结构中, 通常陷入指令( t r a p ) 被实现为长度最短 的指令。这样使得调试器实现断点时可以将t r a p 指令插入到期望设置断点的内存 地址而不会越界覆盖到下一条指令。如图2 2 - 1 所示。 c p u 指令指令长度 7o i n t e lx 8 6i n t3 i n t3 一。 3 1i p o w e r p c 尢陌入猬 爪奈音i :l = l j 仁 了,伐川二 f 法指令 调试器使用操作系统提供的专用接1 :3 调用,可以读写被调试进程执行代码空 间的正文。在被调试进程正文中某内存地址上设置断点,调试器只需要使用专用的 操作系统调用,将原指令读出并保存,同时写入t r a p 指令即可。 当被调试程序运 行到某个断点时,操作系统将陷入内核,同时p c 指针之指向断点的下一条指令。 操作系统将通知d e b u g g e r ,被调试进程挂起,并且通知d e b u g g e r 被调试进程挂起 的原因,p c 指针地址,还有当前正在执行的线程信息。然后,d e b u g g e r 使用操作 系统提供的调试接口读取被调试进程当前的全部上下文信息。在单步或则其他情况 下,d e b u g g e r 需要将预先保存起来的断点位置上的指令恢复,并执行。若该断点 不是临时断点,程序全速执行之前需再用t r a p 指令替换原指令,重新恢复原断点 的设置。 1 6 电子科技大学硕士论文 2 2 1 2 单步 单步执行分为两种:机器指令一级的单步和源代码一级的单步 机器指令的单步通常由硬件提供支持。处理器提供单步状态位,当此状态位被 设置时,处理器会自动处于机器指令一级的单步状态。此单步状态位是处理器状态 信息的一部分,因此单步状态位是线程、进程相关的,因此被设置后不会使得所有 的线程、进程处于单步状态。d e b u g g e r 使用操作系统核心调用将被调试进程 ( d e b u g g e e ) 的此状态位设置后,就可以实现单步调试该进程的功能。 但是由于性能的原因,现代多数r i s c 处理器不支持机器指令单步的功能。而且 从技术上而言,不需要处理器机器指令单步支持,也以较高的效率实现包括机器指 令和源代码一级的单步。 2 2 1 3 错误侦测 捕获程序执行中产生的意外是调试器的首要目的之一。这里说的错误指的包 括: 硬件故障: 除以0 内存越界访问 b u se r r o r i o 故障 上层软件故障 堆栈错误 数组越界访问 通常操作系统会在d e b u g g e e 获得控制权以前通知d e b u g g e r ,该d e b u g g e e 导 致了一个f a u l t ( 错误) 。 2 2 1 - 4 数据断点 数据断点是检测d e b u g g e e 的地址空间的一种通知机制。其目的是找出应用程 序中哪条指令将不是用户期望的值写入了指定地址。 硬件对数据断点的支持有许多种方式。一些硬件提供了一组特殊寄存器,目 的是指定内存开始地址和长度,来限定一段或几段内存块。一旦设定该寄存器组, 处理器将在写入寄存器组指定的内存块之前中断陷入。 1 7 电子科技大学硕士论文 当处理器没有专用的数据断点寄存器时,通常采取另一种方法实现数据断 点。即将想要设置数据断点的内存块标记为只读,当有指令写该内存时,例外发 生,例外中断陷入,同样达到了通知d e b u g g e r 的目的。 在上述两种情况下,操作系统都会通知d e b u g g e r 数据断点中断了程序执行, d e b u g g e r 将此信息通知用户并中断应用程序执行。 2 2 1 5ln t eix 8 6 p e n tiu m 系列处理器的调试机制 现代c p u 提供了一些类似的机制来支持调试,基本包括: 终止程序执行的特殊指令,如t r a p 处理器特殊的单步模式 内存页保护机制 例外和错误检测机制 特殊的调试寄存器 i n t e lx 8 6 和p e n ti u m 硬件特性如下: 变长指令集 三种处理器模式:保护模式,虚拟8 0 8 6 和实模式 地址空间可以是1 6 和3 2 位 t r a p 指令为i n t 3 数据断点寄存器支持 单步模式寄存器t f x 8 6 的堆栈结构如图2 2 2 。x 8 6 的堆栈结构比较典型,d e b u g g e r 堆栈视图 通常是对堆栈的遍历,在此我们简单介绍其结构。 堆栈段寄存器s s 使得系统支持多个堆栈区。e s p 指针指向堆栈顶部。p u s h 和 p o p 操作用于修改e s p 寄存器。栈帧基指针( e b p ) 通常指向传给函数的参数。 1 8 电子科技大学硕士论文 爪 低地址 日的e b p 内容 返回地址 未分配内存 栈顶 一e s p、 局部变量 h e b p 、 传入参数 前一个 s t a c k f r a m e 2 2 2 0 s 对调试的支持 d e b u g g e r 是特殊的用户级应用程序;它不是操作系统的一部分,甚至不是特 权级的应用程序。但是d e b u g g e r 可以通过调用特殊的系统调用来向操作系统注 册,表明它是d e b u g g e r ,将会调试其他的应用程序。通过注册表明自己是 d e b u g g e r ,由d e b u g g e r 生成或附加的被调试进程产生的所有重要事件都会被操作 系统通知d e b u g g e r 。现代操作系统平台上,由于安全的原因,所有d e b u g g e r 和 d e b u g g e e 的交互都必须通过操作系统来传递。 为了使d e b u g g e r 控制d e b u g g e e 的运行,频繁的上下文切换是不可避免的, 而且会花费极大的代价。例如一个断点的处理将导致控制权5 次转移: 被调试程序遇到断点,0 s 获得控制权并处理陷入 0 s 通知正在等待消息的d e b u g g e r d e b u g g e r 向o s 请求d e b u g g e r 信息,控制权转向o s o s 得到d e b u g g e e 上下文信息并发给d e b u g g e r d e b u g g e r 处理信息,并激活d e b u g g e e 。 1 9 电子科技大学硕士论文 在d e b u g g e r 的设计中应该使得其结构能尽量少的导致进程的切换。 2 2 2 1 win 3 2 的调试接口和结构 w i n 3 2 系统的调试接口如下: 函数 c o n t i n u e d e b u g e v e n t 说明 使能d e b u g g e r 继续执行刚刚发生中断事件 的线程 让d e b u g g e r 附加到已经存在的进程进行调 试 停止调试进程 在当前调试的进程中产生断点的意外事件 在指定的调试的进程中产生断点的意外事 件 d e b u g s e t p r o c e s s k i l l o n e x i t 设置线程退出时要执行的动作 f a t a l e x i t将执行控制转移给调试器 f l u s h i n st r u c t i o n c a c h e g e t t h r e a d c o n t e x t 刷新指定进程的指令缓存 得到指定线程的上下文 判断调用的进程是否在调试器控制下运行 发送一个字符串给调试器显示 读指定进程的某内存地址的值 设置线程上下文数据 等待被调试进程中的调试事件发生 改写写指定进程的内存地址的内容 d e b u 幽c t i v e p r o c e s s 用于指定被调试的进程的标识符。注意,如果是在 n t 2 0 0 0 x p 上,如果目标进程是由一个安全描述器创建的,而该安全描述符使调 试器没有充分的访问权,那么此函数的调用可能失败。 处理调试信息: 当我们c r e a t e p r o c e s s 或d e b u g a c t i v e p r o c e s s 打开了被调试的程序后,我们的程 序应调用w a i t f o r d e b u g e v e n t 等待处理调试事件。它阻塞调用线程直到调试的事件 发生此函数的定义是。 w a it f o r d e b u g e v e n t ( v a rl p d e b u g e v e n t :t d e b u g e v e n t :d w m i11is e c o n d s : 2 0 鲢堕型t差i lr u s c型塑型,:;篓舞酏一一一驰 电子科技大学硕士论文 d w o r d ) :b o o l ;s t d c a l l : 其中l p d e b u g e v e n t 结构将在调试事件发生时返回发生的调试事件信 息d w m i l l i s e c o n d s 值指定函数等待调试事件的时间,以毫秒为单位,一般设为 i n f i n i t e ,表示一直等待直到调试事件发生。 这一点类似于一个消息循环。我们一般都会新建一个线程,在线程中使用 d e b u g a c t i v e p r o c e s s 或c r e a t e p r o c e s s 得到个供调试的程序,然后用一个循环 调用w a i t f o r d e b u g e v e n t 来处理随后发生的调试事件。 继续运行被调试程序: 当调试事件发生后,被调试程序会被w i n d o w s 挂起,当我们处理完了调试事件后, 还要让被调试程序继续运行,这就要用到c o n t i n u e d e b u g e v e n t 函数,定义如下: c o n t i n u e d e b u g e v e n t ( d w p r o c e s s i d ,d w t h r e a d l d ,d w c o n t i n u e s t a t u s :d w o r d ) : b o o l :s t d c a l l : 其中d w p r o c e s s l d 和d w t h r e a d l d 是要被恢复的进程和线程i d ,可以从 l p d e b u g e v e n t 结构中的d w p r o c e s s l d 和d w t h r e a d l d 取得d w c o n t i n u e s t a t u s 是指 明如何恢复线程,可能的取值有d b g c o n t i n u e 和d b g e x c e p t i o n _ n o t h a n d l e d , d b g c o n t i n u e 指明了如果被调试程序发生了异常,由调试器来处理异常。 d b g e x c e p t i o n n o t h a n d l e d 则表示调试器不处理被调试程序的异常,由被调试程 序的默认异常处理程序来处理异常。 w i n 3 2 调试消息 消息 e x c ep ti o n d e b u g e v e n t c r e a t e t h r e a d d e b u g e v e n t c r e a t e p r o c e s s d e b u g e v e n t e xi t t h r e a d d e b u g e v e n t e xi t p r o c ess d e b u g e v e n t 2 1 解释 被调试程序产生意外时将产生此消息。 意外包括非法内存读写,除零等。同时 也包括断点,单步,数据断点等意外消 息。 当被调试的进程创建新的线程时,产生 此消息。 当新的进程创建,d e b u g g e e 创建新的子 进程或d e b u g g e r 附加到某进程,产生 此消息。 属于d e b u g g e e 进程的某线程退出产生 的消息。 当被调试进程的最后一个线程退出时产 l o a d d l l d e b u g e v e n t u n l o a d d l l d e b u g e v e n t o u t p u t d e b u g s t r i n g e v e n t r ip e v e n t 生此消息。 被调试进程加载新的动态链接库时产生 此消息 被调试进程卸载动态链接库时产生此消 息 当被调试程序执行o u t p u t d e b u g s t r i n g 函数时产生此消息。 产生系统调试错误时的消息。 有以上消息和函数调用的支持,w i n d o w s 调试程序的基本算法如下: 誊i p b s 黉霪鬻荔 :f o r ? - i 7 。_ ;v 。、。 0 :t “| ;_ 一。、 p。 t m e s s a g e ( ) ,io , ; _ j w a i t f o r s i i f s p e c g g e e 进程。 撼、: 二 。 。一 , e 上s ej- l : j 。 i 萋薹耋攀誊善;c r e a t “e r 、r 一。o 。蔓c e i s 。s ,。l ( , j 魏i k 。 。;。n 。a 烫m 。e 。粪蚕鬻囊甏纂i l ! ;蓊i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版影视制作三方居间服务合同范本
- 2025年度健身房转让合同范本及健身服务合同
- 2025版淘宝天猫店铺年度品牌形象设计与推广合同
- 2025版铁艺装饰品定制与销售服务合同
- 4200字劳动合同范文3篇
- 涉外家政买卖合同4篇
- 象玛静物速写课件
- 象形汉字课件
- 豌豆种植培训课件
- 2025年度高校图书馆电脑维护与电子资源管理系统合同
- 贵州省榕江县2025年上半年事业单位公开遴选试题含答案分析
- 浙江省宁波市五校2024-2025学年高一上学期期中考试生物试卷(含答案)
- 2025云南昆明巫家坝建设发展有限责任公司及下属公司第三季度招聘23人笔试模拟试题及答案解析
- 2025年机动车检验检测机构授权签字人考核试题及答案
- 新学期-启航出发-2025-2026学年初一上学期新生开学第一课主题班会
- 2025年部编版新教材语文八年级上册全册教案设计(含教学计划)
- 人教版新教材小学二年级《数学》上册新教材解读课件
- 2025年秋数学(新)人教版三年级上课件:第1课时 观察物体
- GB/T 45701-2025校园配餐服务企业管理指南
- 2022学校校服选用工作自查整改报告
- 2019修订《城市规划设计计费指导意见》
评论
0/150
提交评论