(计算机软件与理论专业论文)基于arm平台的gdb远程调试环境的研究与移植.pdf_第1页
(计算机软件与理论专业论文)基于arm平台的gdb远程调试环境的研究与移植.pdf_第2页
(计算机软件与理论专业论文)基于arm平台的gdb远程调试环境的研究与移植.pdf_第3页
(计算机软件与理论专业论文)基于arm平台的gdb远程调试环境的研究与移植.pdf_第4页
(计算机软件与理论专业论文)基于arm平台的gdb远程调试环境的研究与移植.pdf_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

摘要 嵌入式系统开发工具在开发过程中所起的作用日益突出,相关研究、技术也随 之不断更新。随着硬件性能不断提升,很多智能家电、智能手机、甚至高端游戏机 都采用了嵌入式系统作为平台进行开发。作为嵌入式开发的关键,调试环节成为嵌 入式系统研发的主要瓶颈。在嵌入式硬件性能不断提升的同时,嵌入式软件规模也 不断扩大,因此调试难度也与日俱增。 本文首先简要说明了嵌入式软件的开发过程,回顾嵌入式交叉调试技术发展的 各种技术。然后分析调试器整个框架和核心,介绍了调试器相关理论和设计思想, 并分别研究,对比几种调试技术实现途径和方法,并对调试器中关键流程进行详细 阐述。 然后,针对g d b 所提供i 3 8 6 和s p a r c 架构下远程调试环境代码进行分析,抽 象出调试桩g d b 进行远程调试的核心流程,并根据具体硬件平台差异在a r m 处理 器上进行代码和远程调试协议移植。本文编写过程中所使用的硬件平台是由使用 a r m 7 处理器的$ 3 c 4 5 1 0 b 开发板。进入测试阶段,又在$ 3 c 4 4 8 0 开发板上进行了 测试,对这套模式的可用性进行了验证。 硕士研究生程君 指导教师蒋静 ( 计算机软件与理论) 教授 关键字:调试器,调试环境,交叉调试,远程调试协议 a b s t r a c t 1 1 他f u n c t i o n so f e m b e d d e ds y s t e md e v e l o p i n gu t i l i t i e sd u r i n gt h ed e v e l o p m e n th a v e b e c o m em o r ea n dm o r ei m p o r t a n t ,a n dt h er e s e a r c ha n dt e c h n i q u e sc o n c e r n i n gt h i sf i e l d a l s ou p d a t er a p i d l y w i t hc o n t i n u o u sp r o m o t i o na n du p g r a d eo f h a r d w a r ep e r f o r m a n c e , m o r ei n t e l l i g e n th o u s e h o l da p p l i a n c e s ,i n t e l l i g e n tm o b i l e s ,e v e na d v a n c e dg a m ec o n s o l e s e m p l o ye m b e d d e ds y s t e ma sd e v e l o p i n gp l a t f o r m a st h ek e yp a r to f e m b e d d e d d e v e l o p m e n t ,d e b u g g i n gs e c t i o nb e c o m e st h em a i no b s t a c l ei nt h ed e v e l o p i n gp r o c e d u r e a st h ef a s tp r o m o t i o no fh a r d w a r ep e r f o r m a n c e ,t h es o f t w a r ed i m e n s i o na l s or a p i d l y e n l a r g e s ,w h i c hm a k e st h ed e b u go p e r a t i o nm o r ed i f f i c u l t i nt h i sp a p e r , t h em a i np r o c e d u r eo f e m b e d d e ds o f t w a r ea n dt h et e c h n i q u e c o n c e r n i n gc r o s sd e b u g g i n gi ne m b e d d e dd e v e l o p i n gi si n t r o d u c e da tf i r s t t h e nt h e f r a m e w o r ka n dc o r eo f d e b u g g e ri sa n a l y z e d w i t hi n t r o d u c i n gt h ed e b u g g e rt h e o r i e sa n d d e s i g np r i n c i p l e a tl a s t ,b yr e s e a r c h i n ga n dc o m p a r i s o no f a s e r i e so f d e b u g g i n gm e t h o d s a n di m p l e m e n t a t i o nw a y s ,t h ek e yp r o c e s si nd e b u g g e rd e v e l o p m e n ti sd e s c r i b e di nd e t a i l a c c o r d i n g t oi 3 8 6a n ds p a r ca r c h i t e c t u r er e m o t ed e b u g g i n ge n v i r o n m e n tc o d e p r o v i d e db yg d bo f f i c i a l l y , t h ec o r ep r o c e s so f g d b r e m o t ed e b u g g i n gi sa v a i l a b l e ,a n d t h i sf r a m e w o r ka n dr e m o t es e r i a lp r o t o c o lc o u l db ep o r t e dt oa r ma r c h i t e c t u r ep l a t f o r m d u r i n gt h er e s e a r c h ,t h eh a r d w a r ep l a t f o r mi s $ 3 c 4 5 1 0 bd e v e l o p i n gb o a r dw i t h a r m 7 p r o c e s s o r i nt h et e s ts t a g e ,t h ec o d ei st e s t e do nt h es 3 c 4 4 8 0b o a r d ,w h i c hp r o v e st h e a r m d e b u g e n v i r o n m e n t su s a b i l i t y p o s t g r a d u a t es t u d e n t :j u nc h e o g ( c o m p u t e rs o f t w a r ea n dt h e o r y ) d i r e c t e db yp r o f e s s o r :j i n gj i a n g k e yw o r d s :d e b u g g e r d e b u ge n v i r o n m e n t ,e r o s sd e b u g g i n g ,r e m o t es e r i a lp r o t o c o l 学位论文独创性声明 本人声明,所呈交的学位论文系本人在导师指导下独立完成的研究成果。文中 依法引用他人的成果,均已做出明确标注或得到许可。论文内容未包含法律意义上 已属于他人的任何形式的研究成果,也不包含本人已用于其他学位申请的论文或成 果。 本人如违反上述声明,愿意承担由此引发的一切责任和后果。 论文作者签名: 币声 日期:刁年f 月扩日 学位论文知识产权权属声明 本人在导师指导下所完成的学位论文及相关的职务作品,知识产权归属学校。 学校享有以任何方式发表、复制、公开阅览、借阅以及申请专利等权利。本人离校 后发表或使用学位论文或与该论文直接相关的学术论文或成果时,署名单位仍然为 青岛大学。 本学位论文属于: 保密口,在 年解密后适用于本声明。 , 不保繇 ( 请在以上方框内打“巾) 燃糍:静 日期硼锄扩日 导师签名: 耨暂 、j 日期嘲年月如 ( 本声明的版权归青岛大学所有,未经许可,任何单位及任何个人不得擅自使用) 第一章引言 第一章引言 1 1 课题的背景与选题的意义 进入2 1 世纪,嵌入式系统的应用越来越广泛,正处于一个高速发展的时期。嵌 入式系统的硬件性能提高非常快,从8 位、1 6 位、3 2 位,乃至6 4 位的嵌入式c p u 已经形成了一个较为完善的产品链,覆盖从低端到高端的各级市场需求。嵌入式系 统最初只应用于一些简单的工控设备上。现在,随着性能的不断提升,很多智能家 电、智能手机、甚至高端游戏机都采用了嵌入式系统作为平台进行开发【“。 作为嵌入式开发的关键,调试环节成为嵌入式系统的主要开发瓶颈。在嵌入式 硬件性能不断提升的同时,嵌入式软件的规模也不断扩大。为了在竞争激烈的市场 中获得更大的利益,开发周期必须尽可能的缩短,这样就需要使用一种易于移植, 通用性强,使用方便的调试器。由于嵌入式设备的多样化每次开发往往面对的硬 件环境是完全不相同的。与p c 环境开发平台不同,嵌入式系统为了节约成本和省 电,硬件的性能远不如p c ,并且由于是针对特定应用,嵌入式硬件系统往往被裁减 为最小集,省略掉所有多余的接口和功能。 通常在嵌入式开发中,目标机不会使用基于x 8 6 平台体系架构,而且嵌入式系 统中使用的设备通常都是不同的。在硬件方面,我们可以归纳出嵌入式系统与普通 i b mp c 系统的区别。 嵌入式系统所使用的c p u 通常为s o c ( s y s t e m ,o n - c h i p ) 的处理器。这类处理器 价格低廉、体积小、耗电量低,可以在一些复杂的环境下运行。在存储设备方面, 嵌入式设备使用n o r 或者n a n df l a s h 作为存储器。根据两种f l a s h 的不同特性,小型 嵌入式设备中一般使用n o rf l a s h ,而多媒体存储设备通常使用n a n df l a s h 。嵌入式 系统所使用r a m 的容量通常远小于普通p c 。p c 中使用的内存为e d o 、s d r a m 、d d r 内存或者r d r a m 等,容量通常为2 5 6 m 以上。而嵌入式r a m 通常为2 m - - 2 5 6 m ,一 般的工控设备使用的r a m 甚至更小。i b mp c 的人机界面为显示器、键盘鼠标等,而 嵌入式设备通常为l c d ,甚至使用串口等设备传输到其他设备进行显示,然后使用 特殊的键盘或者按钮进行操作。这使得直接在嵌入式系统上做开发调试非常困难。 这就引出了交叉调试的概念。 交叉调试使得在高性能的p c 机上调试远程嵌入式系统成为可能。g d b ( g n u d e b u g g e r ) 是开放源代码的g n u c g n ui sn o tu n i x ) 的调试器项目。g d b 作为g n u 的核心部分之一,为用户提供了强大的调试功能。g d b 是g n u 开发链的一部分, 支持多种平台,可以与g e e ,l d 等工具无缝链接,读取其中的调试信息,可以极大 提高开发的效率。g d b 可以实现断点、读写寄存器、读写内存、源码级单步、指令 青岛大学硕士论文 级单步和条件断点等调试功能。这些功能对嵌入式开发调试提供了极大的支持1 2 】。 本课题的目的是对g d b 调试器的远程调试环境进行研究与分析,并将这种机制 移植到a r m 平台上,实现宿主机与远程环境的信息交互,实现交叉调试。 1 2 国内外研究动态 国外在嵌入式开发环境领域已经形成了比较成熟产业格局。其中以v x w o r k s 是 美国风河公司的嵌入式操作系统,通过风河公司所提供的t o r n a d o 嵌入式集成开发 环境,使用由开发商所提供的板级支持包( b o a r ds u p p o r tp a c k a g e ) ,可以方便的对 代码进行编辑、编译、烧写、测试等操作1 3 1 。在调试方面,t o r n a d o 可以使用目标板 b s p 所提供的通讯接口进行调试信息的交互,进行系统集成测试。由于t o r n a d o 性 能优秀,使用方便,占据了大部分市场份额。 近年来,开放源代码的嵌入式操作系统也不断出现。其中应用比较广泛的包括 e c o s 、嵌入式l i n u x 等系统。这些操作系统也都提供了相应的集成开发环境。由于 代码开放,也为嵌入式环境的调试提供了更加广阔的空间,使用自由软件基金会支 持的g n u 工具链,包括c p p 、a s 、g e e 、l d 、g a b 等工具,可以方便代码的预编译、 汇编、编译、链接和调试”】。使用由s u n 公司提供的e c l i p s e 开放开发平台,可以 与g n u 工具链进行集成,通过特定接口与调试程序进行信息交互,实现图形化操 作界面,提高了开发环境的友好度p l 。中国目前在这个领域仍然处于开始阶段。主 要的产品包括红旗嵌入式l i n u x 集成开发环境、英蓓特公司提供的e m b e s t 嵌入式开 发巧境以及由海尔软件所提供的h i d e 嵌入式集成开发环境。 1 3 本文所作的工作 为了完成此课题,我在编写论文的同时完成了以下工作: 通过研究资料和源代码了解o d b 远程调试的基本原理。 以x 8 6 远程调试代码为目标,具体分析实现调试的步骤。 分析a r m 平台的特点,掌握a r m 的体系结构和运行机制,将抽象出的调试流 程移植到a r m 目标机上。 建立宿主机开发环境。 实现r s p ( r e m o t es e r i a lp r o t o c 0 1 ) ,保证宿主机和目标机的通讯。 编写测试代码进行测试。 1 4 论文的组织结构 本文内容安排如下。绪论介绍选题的目的和意义,以及为完成论文所作的工作。 第一章介绍嵌入式平台上进行开发的特点和g d b 在调试过程中所扮演的角色。 第二章介绍a r m 硬件平台的特性,为调试工作提供必要的技术基础。 2 第一章引言 第三章分析并抽象x 8 6 平台下g d b 调试桩的同步与运行机制。 第四章在a r m 平台上进行移植,并针对不同的硬件特性完成r s p 协议,进行 通信。 第五章在宿主机建立开发环境,与目标机进行交叉调试。 第六章总结与展望。 第二章嵌入式系统调试概述 第二章嵌入式系统调试概述 作为嵌入式开发的关键,调试环节成为嵌入式系统的主要开发瓶颈。在嵌入式 硬件性能不断提升的同时,嵌入式软件的规模也不断扩大。为了在竞争激烈的市场 中获得更大的利益,开发周期必须尽可能的缩短,这样就需要使用一种易于移植, 通用性强,使用方便的调试器。 2 1 嵌入式系统概述 嵌入式系统被定义为:以应用为中心、以计算机技术为基础、软件硬件可裁剪、 适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌 入式系统应用非常广泛。在嵌入式系统发展的初期,出于成本和性能的考虑,仅仅 在些工控设备或者简单的监控系统上才能看到嵌入式系统。特别是最近l o 多年, 嵌入式硬件设备,特别是嵌入式处理器,已经有了长足的进步,形成了完整的产业 链,并出现了众多价格低廉、功能强大并且功耗低的产品,包括m i p s 、a 蹦、 p o w e r p c 。产权公司通过直接生产和技术授权提供了大量优秀的产品。因此,在工 控设备、智能家电、智能手机、掌上电脑、掌上游戏机和高端游戏机、电脑主板上 都出现了大量的嵌入式处理器和嵌入式系统1 6 7 1 。 2 2 嵌入式系统开发的特点 2 2 1 功能特征对比 嵌入式系统通常都是根据需求量身订做的,并且由于是嵌入式设备往往是工业 化大规模生产,对于价格非常敏感。而且,因为嵌入式系统这种特定性和专一性, 通常应用程序或者操作系统相对在p c 机的通用操作系统要简单的多,所提供的功 能也不会像普通p c 机涵盖广泛的领域。为了减少空间占用,提高性能,甚至通过 裁减,使其仅包括完成特定功能的最小集。这种设计使得在嵌入式系统上直接进行 开发调试非常困难。在硬件的设计上,也尽量以需求为中心,精减掉多余的设备和 端口,以降低成本。 2 2 2 存储模式对比 嵌入式系统通常不像通用计算机系统那样,需要不断升级更新,一旦完成开发 通过测试就很少再改动。而且,嵌入式系统一般要求系统稳定性高,在运行中要避 免用户对系统的改动,防止系统发生错误。同时,在一些特殊情况下,例如突然断 电等也会造成系统存储出现错误,导致系统无法重新启动。因此通常嵌入式软件都 固化到存储芯片上,在运行时再调入r a m 或者其他可读写的介质中执行。 4 青岛大学硕士论文 2 2 3 软件质量对比 对于大量生产的嵌入式设备,对于成本的变化是非常敏感的,所以在保证代码 正确无误的基础上,尽可能的对代码的长度进行压缩,并降低代码的冗余,降低出 错的几率。 2 3 嵌入式系统的调试方案 根据嵌入式系统特点,通常使用以下几种调试方案进行调试。 2 3 1 指令集模拟器调试方式 源程序模拟器是在通用x 8 6 或者其他高性能平台上,通过软件的方法来模拟某 种处理器的运行。通过这种模拟方式,可以完成对嵌入式系统的基本功能测试,比 如查看寄存器,内存等功能,有些高级的模拟器甚至可以通过i o 接口同设备进行 连接测试。例如s k y e y e 、v m w a r e 、b o c h s ,以及p l e x 8 6 掣引。但是这种方法有很大 的局限性,使用不同架构的c p u 去模拟另外一种架构c p u 的运行,往往兼容性非 常差,无法仿真在真实环境下系统的执行环境,用户必须在硬件平台上完成整个应 用的开发。所以这种方法通常都用于实验性或者探索性研究,在实际的开发中很少 使用。 2 3 2 内部电路仿真器调试方式 内部电路仿真器( i nc i r c u i te m u l a t o r ,i c e ) 调试方式使用处理器内嵌的调试模块 接管中断和异常的处理。用户通过设置c p u 内部某个寄存器来使得某些中断或异常 发生后处理器可以直接进入调试状态,而不必进入操作系统的处理程序。仿真器调 试方式是在处理器的内部加入控制模块。当到达某些特定的条件时,被调试的程序 暂时停止运行,宿主机的调试器通过与被调试系统的通信接口进行连接获取信息。 典型的方式是通过j t a g ( j o i n tt e s ta c t i o ng r o u p ) 进行调试i l 】。这种方法是在真实 的目标机环境下进行测试的,所获得结果相比源程序模拟方式更加可靠。但是这种 方案成本非常高,稳定的功能强大的仿真器价格非常高,而且c p u 不能全速工作。 虽然没有占用一个常用的通讯接口,但是却需要在开发板上额外设计一个j t a g 接 口,提高了成本。 2 3 3 操作系统问调试 这种方案的典型例子是l i n u x 平台的g d bs e r v e r 调试方式。这种方案是在宿主 机上运行g d b ,在目标机上运行g d bs e r v e r ,然后主机端g d b 与目标端g d bs e r v e r 完成通信,进行调试。这种方案具有很大的局限性,根据g d b 官方文档,g d bs e r v e r 需要调用很多操作系统所提供的接口,运行g d bs e r v e r 几乎相当于运行完整的 g d b ,而在资源有限的嵌入式系统上,实现可以支持g d bs e r v e r 的类u n i x 系统毫 无疑闷是非常困难的。况且,如果目标端可以运行g d bs e r v e r 或者g d b ,便可以 第二章嵌入式系统调试概述 直接在目标机进行调试。所以这种调试方案通常用于两个类u n i x 系统之间的应用程 序级的调试1 9 ,。 2 3 ,4 驻留监控调试方式 通过目标机与宿主机的协同,可以完成监控器调试的方式。软件插桩是在目标 机上一段可执行代码,它与宿主机端的调试器一起完成对程序的调试。这种方式不 需要在硬件上有额外的设备支持,节省了开发成本,但是在调试过程中,需要更多 的软件支持,所以开发难度相比硬件调试桩复杂。但是如果完成了这种软件插桩调 试方案,便很容易与其他方式相结合,扩展性非常强。缺点是在硬件调试完成后才 能进行调试,同时需要占用目标板上的资源。本课题就使用这种方案i l “”l 。 2 4 插桩调试器的选择 通常,远程调试器是基于服务器,客户端模式实现的,由宿主机上的本地调试器、 目标机上的调试服务器、远程调试协议三部分组成。本地调试器主要实现对源文件、 目标文件和符号表的访问及处理,接收用户输入的调试命令,并根据远程调试协议 封装成调试命令请求包,通过底层的通信功能发送给调试服务器,同时,接收调试 服务器返回的调试信息,以获取目标程序的当前运行状态等。调试服务器负责监控 被调试目标程序的运行状态,根据远程调试协议,接收并解析用户的远程调试命令, 以获取目标程序当前运行的状态信息,并返回给用户。远程调试协议负责封装和解 析调试命令和调试信息。 远程调试会话的建立方式有两种:方式一,目标程序出错后自动进入调试状态; 方式二,由程序员在启动时主动进入调试状态。在第一种方式下,在目标系统运行的 目标程序首先发生程序异常,进入异常中断程序,调试插桩程序将在目标系统的显 示屏给出提示信息,询问是否要求调试目标程序。这时,如果要调试目标程序,可以 在宿主机上启动本地调试器。被调试的目标程序将停在发生异常的机器指令上。在 第二种方式下,程序员首先在宿主机上启动本地调试器,然后在目标操作系统的命 令行状态下。输入系统内部命令以调试方式启动目标程序,被调试的目标程序将停 在第一行可执行语句。同时实现这两种调试会话建立方式的方法在于,调试插桩程 序在发送完第一个调试模块包后,进入等待应答状态,当超时未出现应答,重发第 一个调试模块包。这样,如果是第一种方式,调试插桩程序将不停地发送第一个调试 模块包,直到本地调试器被启动。如果是第二种方式,本地调试器将首先在守护状态, 等待调试模块包,等到目标程序以调试方式启动之后,将在接收到第一个调试模块 包时,建立调试会话。 对于插桩调试方案,调试器的选择非常重要。目前,国外很多公司提供了调试 器,包括w i n d r i v e r 公司的s i n g l e s t e p ,a r m 公司的r e a l v i e w ,以及g n u 的o d b 6 青岛大学硕士学位论文 等等。当然,我们也可以完全从头开发一种宿主机调试器与调试桩进行调试,也可 以通过使用一种现成的调试器进行开发。两种方案各有利弊。 1 使用完全自主开发的调试器可以省去很多不需要的模块,甚至省去一些协议 的移植以节省时间。但是这种方案的可移植性非常差,每次面对不同的目标平台, 都需要自己根据目标平台的硬件架构进行重新开发,比如一个可以支持a r m 的调 试器,如果要调试p o w e r p c 处理器,不但要移植软件调试桩,还需要调整宿主机的 调试器分析架构。而且如果要实现源码级调试,调试器就必须要识别编译器所生成 的调试信息,一个从零开发的调试器必须要完成对调试信息和符号表的识别。整个 项目的工作量是非常可观的。 2 如果使用已经成熟的调试器,虽然要完成某些通信协议,使调试桩按照某种 g d b 安排好的方案去编写,但可以避免上述一些不必要的开发过程。例如使用g d b ( g n ud e b u g g e r ) 。g n u 工具链之间可以无缝连接。通过g c c ,i d 生成的调试信 息和本地符号表等,都可以在g d b 中直接载入,通过与远程调试桩的通讯,从而实 现源码级调试1 4 l o j 。并且作为开源项目,有大量的文档可以使用,并且可以通过同其 他开源程序相结合。用图形界面实现调试,例如e c l i p s e 、d d d 和g d bi n s i g h t 。基 于上述优点,在本项目的研究过程中,将使用g d b 作为调试器进行代码移植。 7 第三章g d b 基本调试原理 第三章g d b 基本调试原理 g d b ( g n ud e b u g g e r ) 是开放源代码的g n u ( g n ui sn o tu n i x ) 的调试器项目。 g d b 作为g n u 的核心部分之一,为用户提供了强大的调试功能。g d b 是g n u 开 发链的部分,支持多种平台,可以与g e e ,t d 等工具无缝链接,读取其中的调试 信息,可以极大提高开发的效率。 3 1g d b 和g c c 简介 g d b 是由自由软件基金会所支持的项目,起初是由r i c h a r ds t a l l m a n 所开发, 后来很多开发人员在g d b 的开放过程中作出了巨大贡献。作为g n u 开发工具链中 的核,i h , 组件之一,运行于u n i x 兼容环境下,通常都与g n u 的c 编译器g c c 等工 具联合使用,并且支持多种平台和开发语言。作为开源项目,我们可以深入到g d b 的内部去研究其实现的方案,更深刻的了解其运行机制,并且可以根据自己的需求, 于g d b 的代码进行某些修改。 图3 1 g c c 编译过程”w 编译器的作用是将使用高级语言或者使用汇编语言所编写的程序代码编译成某 种处理器上的指令。l i n u x 系统下的g e e 是一种功能强大的跨平台编译器。g e e 编译 器可以将c 、c + + 、汇编程序和目标程序编译、链接成可执行文件,如图3 1 所示。 g e e 在编译过程中,首先调用c p p 进行预处理,在此过程中,需要分析预编译语句 等信息。然后使用c c l 进行编译,生成扩展名为o 的目标文件。然后g e e 会调用l d 8 青岛大学硕七学位论文 来完成链接,按照某种安排好的格式,目标文件被置于某些特定的位置。在编译的 过程中,可以使用多种参数,使用这些参数可以优化代码,规定编译警告,进行预 处理,生成调试信息等。使用g c c 对源文件进行编译的时候,可以使用g 的参数, 在s 文件中插入汇编伪指令。这个过程是在c 文件编译成s 之后完成的插入的这 些汇编伪指令就成为调试信息,这些调试信息然后会按照编译时候的参数,以特定 的格式添加到目标文件中去,例如s t a b s 、c o f f 和x c o f f 。这样在使用g d b 的过 程中,便可以自动识别并抽取这些信息进行分析调试 1 4 , 1 5 】。 在嵌入式开发过程中,通常使用交叉编译的方法,即负责开发和调试的宿主机 和目标机使用不同的处理器架构。常见的宿主机架构是i 3 8 6 架构,也就是我们所使 用的p c 机架构,使用操作系统w i n d o w s 或者l i n u x 等,而目标端则使用基于a r m 、 m i p s 或者p o w e r p c 等架构的平台,这就是交叉编译。交叉编译是指程序在一台计 算机上编译,然后把编译好可执行代码放到另一台计算机上运行。采用交叉编译是 因为一般来说主机系统比目标系统要快得多,而且具有多得多的可用资源,这样在 编译过程中可以获得更快的速度和更多的系统支持。基于同样的道理,嵌入式系统 的调试器运行在主机系统上,而被调试的程序则运行在目标系统上。在本课题研究 中,调试过程中,由宿主机端g d b 与目标端的调试桩,使用r e m o t es e r i a lp r o t o c o l 通过物理通讯介质进行信息交互,如图3 2 所示。 图3 2g d b 远程调试模型 3 2 源码级调试技术原理 程序运行过程中目标程序的指令代码和数据都映射到目标机上相对应的内存 中,调试器利用目标文件中在程序编译链按时生成的调试信息来实现目标程序与源 程序之间的映射,从而在源码级实现对程序执行情况的控制和观察。其关键在于找 到数据和调试控制点在源程序与目标程序之间的映射关系。任何数据都有名和值两 个方面,数据名与数据值之间的映射关系为:根据数据名得到存放该数据值的内存 地址,再从目标机的内存地址取出其内容即为数据值【1 6 1 。 调试中的程序控制点通常为源程序中的函数名或语句行,它们对应于装载到目 9 第三章g d b 基本调试原理 标内存中的相应目标代码,要实现程序的运行控制关键在于得到源代码与目标代码 之间的映射关系;由源码定位信息得至4 相应的目标码信息;由目标码地址得到相应 的源码定位信息。源码定位信息为源文件名和行号或函数名;目标码信息为目标指 令在目标机内存中的起始和终止地址。 3 2 1e l f 文件格式及调试信息的表示 计算机体系中目标代码文件有多种格式,如p e 、e l f 、d w a r f ,c o f f 、a o u t 等。其中e l f 是广为使用的一种格式,其跨平台特性和广泛的支持使得e l f ( e x e c u t a b l ea n dl i n k a b l ef o r m a t ) 格式逐渐成为一个商业标准【 1 。可执行连接格式 e l f 是u n i x 系统实验室( u s l ) 作为应用程序二进制接1 2 1 ( a p p l i c a t i o nb i n a r y i n t e r f a c e ( a b i ) 而开发和发布的。工具接1 3 标准委员会( t i s ) 选择了正在发展中的e l f 标准作为在3 2 位i n t e l 体系上不同操作系统之间可移植的二进制文件格式,目前 e l f 格式在开发中广泛使用。假定开发者定义了一个二进铝6 接口集合,e l f 标准用 它来支持流线型的软件发展。应该减少不同执行接口的数量。因此可以减少重新编 程重新编译的代码1 1 2 1 。 链接视图 e l f 头 程序头表( 可选) s e c t i o nl s e c t i o n2 s e e t i o nn 节头表 执行视图 e l f 头 程序头表 s e c t i o nl s e c t i o n2 s e c t i o nn 节头袭( 可选) 图3 3 链接视图及执行视图 e l f 目标文件主要有三种类型,分别是: 1 可重定位文件:该文件保存的数据与代码适合与其它目标文件链接生成一个 可执行文件或者共享目标文件。 2 可执行文件:该文件保存的程序适合执行。该文件指定“e c 形成一个程序 的进程映像。 1 0 青岛大学硕士学位论文 3 共享目标文件:共享目标文件有两个应用,第个就是l d 可以将该文件与 其它重定位文件或共享目标文件重新生成另外一个目标文件,第二个就是动态链接 器与一个可执行文件或其它共享目标文件重新生成一个进程映像。通过汇编器与链 接编辑器生成的程序的二进制表示的目标文件是可以在处理器上直接执行的。组织 格式如图3 3 所示。图中描述了重定位目标文件格式,共享文件和可执行文件格式 视图。 3 2 2e l f 头的结构 一个e l f 头在文件的开始,保存了基本e l f 信息,描述了该文件的结构和组织。 它的成员有: u n s i g n e dc h a rei d n e t 1 6 ; e l f 文件信息 e l f 3 2h a l f e - t y p e ;表示目标文件的类型 e l f 3 2h a l f e _ m a c h i n e ; 表示目标文件所需的硬件体系架构 e l f 3 2w o r dev e r s i o n ;显示当前目标文件的版本号 e l f 3 2 _ a d d re _ e n t r y ;显示程序开始执行的实际地址 e l f 3 2 _ o f f ep h o f f ; 程序头表在文件内的偏移量,以字节计 e l f 3 2o f f es h o f f ;节头表的文件偏移量,以字节计 e l f 3 2 _ w o r de _ _ f l a g s ; 显示特定处理器相关的标志位 e l f 3 2 _ h a l f ee h s i z e ;胍! l f 头的大小,以字节计 e l f 3 2 _ h a l f e _ p h e n t s i z e ; 程序头表表项的大小,以字节计 e l f 3 2 _ h a l f e _ p h n u m ; 程序头表包含的表项数目 e l f 3 2i - i a l f es h e n t s i z e ;肺头表表项的大小,以字节计 e l f 3 2 _ h a l f e _ s h n m u m ;节头表包含的表项数目 e l f 3 2 _ h a l f e _ s h s t r n d x l 节名字符串表在节头表中的索引。 ) ei d e n t 1 6 部分内容解释如下: e _ i d n e t 0 3 】:目标文件格式标识。 e _ i d e n t 4 目标文件所针对的目标机的位数。 e _ i d e n t 5 :目标文件的数据的存放方式 ei a e n t 6 :目标文件的版本号 ei d e n t 7 1 5 】:未定义,以零填充。 3 2 3 节头表结构 节是从链接的视角上看问题的,含有大量的目标文件信息,包括指令,数据, 第三章g d b 基本调试原理 还有符号表,重定位信息等。一个节头表( s e c t i o nh e a d e rt a b l e ) 包含了描述文件 s e c t i o n 的信息。每个s e c t i o n 在这个表中有一个入1 2 ;每个入口给出了该s e c t i o n 的 名字,大小,等等信息。 e l f 3 2w o r ds hn a m e ;标识该节节名在节名字符串表中的偏移量 e l t 3 2w o r ds ht y p e :节类型 e 1 1 3 2w o r ds hf l a g s :节属性标志( 执行时该节可写否,装入时否需调入) 内 存。是否包含可执行指令等等 e 1 1 3 2a d d rs ha d d r ;如果该节需装入内存,此为节所在的内存起始地址 e 1 1 3 2o f f s ho f f s e t ;该节在文件内的偏移量 e l f 3 2w o r ds hs i z e ;节的大小( 字节数) e 1 1 3 2w o r ds hl i n k ;依节类型而定 e l f 3 2w o r ds hi n f o ;,依节类型而定 e 1 1 3 2w o r ds ha d d r a l i g i i ;,节地址对齐要求 e l f 3 2w o r ds he n t s i z e :如该节内容由定长的节项组成,则此值为节项大小 ( 字节数) ) ; 3 2 4 程序头表表项结构 一个程序头表( p r o g r a mh e a d e rt a b l e ) 存在,那么其告诉系统如何来创建一个 进程的内存映象。或者说被用来建立进程映象的文件必须要有一个程序头表o ”】。一 个可执行的或者共享目标文件的程序头表是一个结构数组,每项描述了一个段或者 系统需要准备程序执行的其它信息。一个目标文件的段包含一个或者多个节,程序 头只是对可执行文件与共享目标文件有意义,一个文件通过e l f 头的e _ p h e n t i s e z e 和e 来指定他的程序头大小。phnum t y p e d e fs t r u c t e 1 1 3 2 一w o r d p _ t y p e ; 段类型 e 1 1 3 2 _ o f fp _ o f f s e t ;段位置相对于文件开始处的偏移量 e 1 1 3 2 - a d d rpv a d d r ; 段在内存中的地址 e 1 f 3 2a d d r pp a d & ; 段的物理地址 e l f 3 2w o r d p _ f i l e s z ; 段在文件中的长度 e 1 f 3 2w o r dpm e m s z ; 段在内存中的长度 e 1 1 3 2w o r d pf l a g s ; 段的标记 e 1 1 3 2w o r d p _ a l i g n ; 段在内存中对齐标记) 1 2 青岛大学硕士学位论文 3 3s t a b s 格式调试信息 s t a b s 是一种用来为调试器描述程序的格式。这种格式是由加州大学伯克利分校 的p e t e rk e s s l e r 提供的,最初是用来为p a s c a l 调试器提供服务的,现在这种格式已 经用于其他调试器 1 5 , 1 9 1 。 g n uc 编译器将c 源文件编译成为扩展名为s 的汇编文件。然后汇编程序将s 文件转换为o 格式文件,然后连接器将s 格式的文件和库文件合并在一起生成可执 行文件。使用g 的参数,g c c 在s 文件格式中加入了额外的调试信息,然后在汇编 程序和连接器中经过转换后,加入到最终的可执行文件中。这些调试信息描述了源 文件中的特征,包括行号、变量的类型和取值范围、函数名称、参数等信息。针对 目标文件格式,汇编程序将调试信息以s t a b 格式进行封装,然后将这些调试信息分 散的加入生成代码中。调试信息通常是以汇编的伪指令的形式出现的,并且和汇编 指令语句融合在一起。g n u 工具可以从c o f f 和e c o f f 目标文件格式中提取s t a b s 格式的调试信息。 s t a b s 主要以四种伪指令格式加入汇编代码,分别是; s t a b s “s t r i n g ”,t y p e ,o t h e r ,d e s c ,v a l u e s t a b nt y p e ,o t h e r , d e s c ,v a l u e s t a b dt y p e ,o t h e r , d e s c s t a b x “s t r i n g ,v a l u e ,t y p e ,s d b - t y p e 在实际应用中,通常使用s t a b s 和s t a b n 格式的伪指令。s t a b s 伪指令主要是为了 标记源文件中的文件名、函数、变量等信息。s t a b n 是为了标记源程序中的行号、程 序块的结构等信息。对于s t a b n 和s t a b d ,是没有s t r i n g 参数的。对于s t a b d ,v a l u e 域是固定不变的,并且值等于当前文件的位置。对于s t a b x ,s d b t y p e 的值总是为0 。 其他的值几乎是缺省为0 。t y p e 的数值给出了一些关于s t a b 类型的基本信息。每一 种合法类型数字都定义了一种不同的s t a b 格式。而且,s t a b 格式定义了具体的解释 方法、可能的v a l u e 取值范围、s t r i n g 、d e s c 或者v a l u e 当前的数值等。s t a b s 和s t a b n 伪指令格式中的t y l ) e 字段为一从0 到0 x f f 的整数值,该值决定了该条伪指令所表示 的信息是否为s t a b 信息( 0 - - 0 x l f 则为普通符号信息,否则为s t a b s 信息) ,也决定 了其余字段的内容。常见的与c 语言有关的s t a b s 信息类型定义及解释如下: 0 x 2 0ng s y m :全局变量。 0 x 2 4nf u n :函数名或代码变量( t e x t 节) 。 0 x 2 6ns t s y m :赋了初值的静态变量( d a t a 节) 0 x 2 8nl c s y m :未赋初值的静态变量( b s s 节) 。 0 x 2 anm a i n :m a i n 函数标识。 第三章g d b 基本调试原理 o ) 【2 cnr o s y m :位于只读段的变量。 0 x 3 eno p t :调试器选择。 o ) 【4 0nr s y m :寄存器变量。 0 x 4 4ns l i n e :t e x t 中的行号。 0 x 4 6nd s l i n e :d a t a 节的行号。 0 x 4 8nb s l i n e :b s s 节中的行号。 0 x 6 4ns o :源文件名或路径名,v a l u e 值为对应目标代码的起始地址 0 x s 0nl s y m ;局部交量或类型标识。 0 x 8 2nb i n c l :头文件调试信息开始 0 x 8 4ns o l :头文件名,其v a l u e 值为对应目标代码的起始地址。 o ) 【a onp s y m :形参变量。 0 x a 2ne i n c l :头文件调试信息结束。 o x c onl b r a c :源文件中个块的开始标识( 相当于c 语言中的”( ”) o x c 2ne x c l ;该头文件已被前面的源文件包含,具体含义在下面的调试信息 提取内容部分中会进一步进行解释。 0 x e 0nr b r a c :源文件中一个块的结束标识( 相当于c 语言中的”) 。 大多数调试信息都存在于s t r i n g 域中。s t r i n g 域的格式非常灵活,甚至一些s t a b 类型的s t r i n g 域仅包含一个名称。通常s t r i n g 域的格式如下: n a n l e :s y m b o l - - d e s c r i p t o rt y p e - - i n f o r m a t i o n n a m e 是符号的名称。当s t a b 代表了一个未命名对象时,n a m e 可以忽略。 其中n a m e 是s t a b s 调试

温馨提示

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

评论

0/150

提交评论