![[硕士论文精品]基于arm平台的gdb远程调试环境的研究与移植_第1页](http://file.renrendoc.com/FileRoot1/2017-12/8/1a72ff3d-9fea-4415-8517-cb9c3a34153c/1a72ff3d-9fea-4415-8517-cb9c3a34153c1.gif)
![[硕士论文精品]基于arm平台的gdb远程调试环境的研究与移植_第2页](http://file.renrendoc.com/FileRoot1/2017-12/8/1a72ff3d-9fea-4415-8517-cb9c3a34153c/1a72ff3d-9fea-4415-8517-cb9c3a34153c2.gif)
![[硕士论文精品]基于arm平台的gdb远程调试环境的研究与移植_第3页](http://file.renrendoc.com/FileRoot1/2017-12/8/1a72ff3d-9fea-4415-8517-cb9c3a34153c/1a72ff3d-9fea-4415-8517-cb9c3a34153c3.gif)
![[硕士论文精品]基于arm平台的gdb远程调试环境的研究与移植_第4页](http://file.renrendoc.com/FileRoot1/2017-12/8/1a72ff3d-9fea-4415-8517-cb9c3a34153c/1a72ff3d-9fea-4415-8517-cb9c3a34153c4.gif)
![[硕士论文精品]基于arm平台的gdb远程调试环境的研究与移植_第5页](http://file.renrendoc.com/FileRoot1/2017-12/8/1a72ff3d-9fea-4415-8517-cb9c3a34153c/1a72ff3d-9fea-4415-8517-cb9c3a34153c5.gif)
已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要嵌入式系统开发工具在开发过程中所起的作用日益突出,相关研究、技术也随之不断更新。随着硬件性能不断提升,很多智能家电、智能手机、甚至高端游戏机都采用了嵌入式系统作为平台进行开发。作为嵌入式开发的关键,调试环节成为嵌入式系统研发的主要瓶颈。在嵌入式硬件性能不断提升的同时,嵌入式软件规模也不断扩大,因此调试难度也与日俱增。本文首先简要说明了嵌入式软件的开发过程,回顾嵌入式交叉调试技术发展的各种技术。然后分析调试器整个框架和核心,介绍了调试器相关理论和设计思想,并分别研究,对比几种调试技术实现途径和方法,并对调试器中关键流程进行详细阐述。然后,针对GDB所提供I386和SPARC架构下远程调试环境代码进行分析,抽象出调试桩GDB进行远程调试的核心流程,并根据具体硬件平台差异在ARM处理器上进行代码和远程调试协议移植。本文编写过程中所使用的硬件平台是由使用ARM7处理器的3C4510B开发板。进入测试阶段,又在3C4480开发板上进行了测试,对这套模式的可用性进行了验证。硕士研究生程君指导教师蒋静计算机软件与理论教授关键字调试器,调试环境,交叉调试,远程调试协议ABSTRACT11他FUNCTIONSOFEMBEDDEDSYSTEMDEVELOPINGUTILITIESDURINGTHEDEVELOPMENTHAVEBECOMEMOREANDMOREIMPORTANT,ANDTHERESEARCHANDTECHNIQUESCONCERNINGTHISFIELDALSOUPDATERAPIDLYWITHCONTINUOUSPROMOTIONANDUPGRADEOFHARDWAREPERFORMANCE,MOREINTELLIGENTHOUSEHOLDAPPLIANCES,INTELLIGENTMOBILES,EVENADVANCEDGAMECONSOLESEMPLOYEMBEDDEDSYSTEMASDEVELOPINGPLATFORMASTHEKEYPARTOFEMBEDDEDDEVELOPMENT,DEBUGGINGSECTIONBECOMESTHEMAINOBSTACLEINTHEDEVELOPINGPROCEDUREASTHEFASTPROMOTIONOFHARDWAREPERFORMANCE,THESOFTWAREDIMENSIONALSORAPIDLYENLARGES,WHICHMAKESTHEDEBUGOPERATIONMOREDIFFICULTINTHISPAPER,THEMAINPROCEDUREOFEMBEDDEDSOFTWAREANDTHETECHNIQUECONCERNINGCROSSDEBUGGINGINEMBEDDEDDEVELOPINGISINTRODUCEDATFIRSTTHENTHEFRAMEWORKANDCOREOFDEBUGGERISANALYZEDWITHINTRODUCINGTHEDEBUGGERTHEORIESANDDESIGNPRINCIPLEATLAST,BYRESEARCHINGANDCOMPARISONOFASERIESOFDEBUGGINGMETHODSANDIMPLEMENTATIONWAYS,THEKEYPROCESSINDEBUGGERDEVELOPMENTISDESCRIBEDINDETAILACCORDINGTOI386ANDSPARCARCHITECTUREREMOTEDEBUGGINGENVIRONMENTCODEPROVIDEDBYGDBOFFICIALLY,THECOREPROCESSOFGDBREMOTEDEBUGGINGISAVAILABLE,ANDTHISFRAMEWORKANDREMOTESERIALPROTOCOLCOULDBEPORTEDTOARMARCHITECTUREPLATFORMDURINGTHERESEARCH,THEHARDWAREPLATFORMIS3C4510BDEVELOPINGBOARDWITHARM7PROCESSORINTHETESTSTAGE,THECODEISTESTEDONTHES3C4480BOARD,WHICHPROVESTHEARMDEBUGENVIRONMENTSUSABILITYPOSTGRADUATESTUDENTJUNCHEOGCOMPUTERSOFTWAREANDTHEORYDIRECTEDBYPROFESSORJINGJIANGKEYWORDSDEBUGGERDEBUGENVIRONMENT,EROSSDEBUGGING,REMOTESERIALPROTOCOL学位论文独创性声明本人声明,所呈交的学位论文系本人在导师指导下独立完成的研究成果。文中依法引用他人的成果,均已做出明确标注或得到许可。论文内容未包含法律意义上已属于他人的任何形式的研究成果,也不包含本人已用于其他学位申请的论文或成果。本人如违反上述声明,愿意承担由此引发的一切责任和后果。论文作者签名币声日期刁年F月扩日学位论文知识产权权属声明本人在导师指导下所完成的学位论文及相关的职务作品,知识产权归属学校。学校享有以任何方式发表、复制、公开阅览、借阅以及申请专利等权利。本人离校后发表或使用学位论文或与该论文直接相关的学术论文或成果时,署名单位仍然为青岛大学。本学位论文属于保密口,在年解密后适用于本声明。,不保繇请在以上方框内打“巾燃糍静日期硼锄扩日导师签名耨暂、J日期嘲年月如本声明的版权归青岛大学所有,未经许可,任何单位及任何个人不得擅自使用第一章引言第一章引言11课题的背景与选题的意义进入21世纪,嵌入式系统的应用越来越广泛,正处于一个高速发展的时期。嵌入式系统的硬件性能提高非常快,从8位、16位、32位,乃至64位的嵌入式CPU已经形成了一个较为完善的产品链,覆盖从低端到高端的各级市场需求。嵌入式系统最初只应用于一些简单的工控设备上。现在,随着性能的不断提升,很多智能家电、智能手机、甚至高端游戏机都采用了嵌入式系统作为平台进行开发【“。作为嵌入式开发的关键,调试环节成为嵌入式系统的主要开发瓶颈。在嵌入式硬件性能不断提升的同时,嵌入式软件的规模也不断扩大。为了在竞争激烈的市场中获得更大的利益,开发周期必须尽可能的缩短,这样就需要使用一种易于移植,通用性强,使用方便的调试器。由于嵌入式设备的多样化每次开发往往面对的硬件环境是完全不相同的。与PC环境开发平台不同,嵌入式系统为了节约成本和省电,硬件的性能远不如PC,并且由于是针对特定应用,嵌入式硬件系统往往被裁减为最小集,省略掉所有多余的接口和功能。通常在嵌入式开发中,目标机不会使用基于X86平台体系架构,而且嵌入式系统中使用的设备通常都是不同的。在硬件方面,我们可以归纳出嵌入式系统与普通IBMPC系统的区别。嵌入式系统所使用的CPU通常为SOCSYSTEM,ONCHIP的处理器。这类处理器价格低廉、体积小、耗电量低,可以在一些复杂的环境下运行。在存储设备方面,嵌入式设备使用NOR或者NANDFLASH作为存储器。根据两种FLASH的不同特性,小型嵌入式设备中一般使用NORFLASH,而多媒体存储设备通常使用NANDFLASH。嵌入式系统所使用RAM的容量通常远小于普通PC。PC中使用的内存为EDO、SDRAM、DDR内存或者RDRAM等,容量通常为256M以上。而嵌入式RAM通常为2M256M,一般的工控设备使用的RAM甚至更小。IBMPC的人机界面为显示器、键盘鼠标等,而嵌入式设备通常为LCD,甚至使用串口等设备传输到其他设备进行显示,然后使用特殊的键盘或者按钮进行操作。这使得直接在嵌入式系统上做开发调试非常困难。这就引出了交叉调试的概念。交叉调试使得在高性能的PC机上调试远程嵌入式系统成为可能。GDBGNUDEBUGGER是开放源代码的GNUCGNUISNOTUNIX的调试器项目。GDB作为GNU的核心部分之一,为用户提供了强大的调试功能。GDB是GNU开发链的一部分,支持多种平台,可以与GEE,LD等工具无缝链接,读取其中的调试信息,可以极大提高开发的效率。GDB可以实现断点、读写寄存器、读写内存、源码级单步、指令青岛大学硕士论文级单步和条件断点等调试功能。这些功能对嵌入式开发调试提供了极大的支持12】。本课题的目的是对GDB调试器的远程调试环境进行研究与分析,并将这种机制移植到ARM平台上,实现宿主机与远程环境的信息交互,实现交叉调试。12国内外研究动态国外在嵌入式开发环境领域已经形成了比较成熟产业格局。其中以VXWORKS是美国风河公司的嵌入式操作系统,通过风河公司所提供的TORNADO嵌入式集成开发环境,使用由开发商所提供的板级支持包BOARDSUPPORTPACKAGE,可以方便的对代码进行编辑、编译、烧写、测试等操作131。在调试方面,TORNADO可以使用目标板BSP所提供的通讯接口进行调试信息的交互,进行系统集成测试。由于TORNADO性能优秀,使用方便,占据了大部分市场份额。近年来,开放源代码的嵌入式操作系统也不断出现。其中应用比较广泛的包括ECOS、嵌入式LINUX等系统。这些操作系统也都提供了相应的集成开发环境。由于代码开放,也为嵌入式环境的调试提供了更加广阔的空间,使用自由软件基金会支持的GNU工具链,包括CPP、AS、GEE、LD、GAB等工具,可以方便代码的预编译、汇编、编译、链接和调试”】。使用由SUN公司提供的ECLIPSE开放开发平台,可以与GNU工具链进行集成,通过特定接口与调试程序进行信息交互,实现图形化操作界面,提高了开发环境的友好度PL。中国目前在这个领域仍然处于开始阶段。主要的产品包括红旗嵌入式LINUX集成开发环境、英蓓特公司提供的EMBEST嵌入式开发巧境以及由海尔软件所提供的HIDE嵌入式集成开发环境。13本文所作的工作为了完成此课题,我在编写论文的同时完成了以下工作通过研究资料和源代码了解ODB远程调试的基本原理。以X86远程调试代码为目标,具体分析实现调试的步骤。分析ARM平台的特点,掌握ARM的体系结构和运行机制,将抽象出的调试流程移植到ARM目标机上。建立宿主机开发环境。实现RSPREMOTESERIALPROTOC01,保证宿主机和目标机的通讯。编写测试代码进行测试。14论文的组织结构本文内容安排如下。绪论介绍选题的目的和意义,以及为完成论文所作的工作。第一章介绍嵌入式平台上进行开发的特点和GDB在调试过程中所扮演的角色。第二章介绍ARM硬件平台的特性,为调试工作提供必要的技术基础。2第一章引言第三章分析并抽象X86平台下GDB调试桩的同步与运行机制。第四章在ARM平台上进行移植,并针对不同的硬件特性完成RSP协议,进行通信。第五章在宿主机建立开发环境,与目标机进行交叉调试。第六章总结与展望。第二章嵌入式系统调试概述第二章嵌入式系统调试概述作为嵌入式开发的关键,调试环节成为嵌入式系统的主要开发瓶颈。在嵌入式硬件性能不断提升的同时,嵌入式软件的规模也不断扩大。为了在竞争激烈的市场中获得更大的利益,开发周期必须尽可能的缩短,这样就需要使用一种易于移植,通用性强,使用方便的调试器。21嵌入式系统概述嵌入式系统被定义为以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统应用非常广泛。在嵌入式系统发展的初期,出于成本和性能的考虑,仅仅在些工控设备或者简单的监控系统上才能看到嵌入式系统。特别是最近LO多年,嵌入式硬件设备,特别是嵌入式处理器,已经有了长足的进步,形成了完整的产业链,并出现了众多价格低廉、功能强大并且功耗低的产品,包括MIPS、A蹦、POWERPC。产权公司通过直接生产和技术授权提供了大量优秀的产品。因此,在工控设备、智能家电、智能手机、掌上电脑、掌上游戏机和高端游戏机、电脑主板上都出现了大量的嵌入式处理器和嵌入式系统1671。22嵌入式系统开发的特点221功能特征对比嵌入式系统通常都是根据需求量身订做的,并且由于是嵌入式设备往往是工业化大规模生产,对于价格非常敏感。而且,因为嵌入式系统这种特定性和专一性,通常应用程序或者操作系统相对在PC机的通用操作系统要简单的多,所提供的功能也不会像普通PC机涵盖广泛的领域。为了减少空间占用,提高性能,甚至通过裁减,使其仅包括完成特定功能的最小集。这种设计使得在嵌入式系统上直接进行开发调试非常困难。在硬件的设计上,也尽量以需求为中心,精减掉多余的设备和端口,以降低成本。222存储模式对比嵌入式系统通常不像通用计算机系统那样,需要不断升级更新,一旦完成开发通过测试就很少再改动。而且,嵌入式系统一般要求系统稳定性高,在运行中要避免用户对系统的改动,防止系统发生错误。同时,在一些特殊情况下,例如突然断电等也会造成系统存储出现错误,导致系统无法重新启动。因此通常嵌入式软件都固化到存储芯片上,在运行时再调入RAM或者其他可读写的介质中执行。4青岛大学硕士论文223软件质量对比对于大量生产的嵌入式设备,对于成本的变化是非常敏感的,所以在保证代码正确无误的基础上,尽可能的对代码的长度进行压缩,并降低代码的冗余,降低出错的几率。23嵌入式系统的调试方案根据嵌入式系统特点,通常使用以下几种调试方案进行调试。231指令集模拟器调试方式源程序模拟器是在通用X86或者其他高性能平台上,通过软件的方法来模拟某种处理器的运行。通过这种模拟方式,可以完成对嵌入式系统的基本功能测试,比如查看寄存器,内存等功能,有些高级的模拟器甚至可以通过IO接口同设备进行连接测试。例如SKYEYE、VMWARE、BOCHS,以及PLEX86掣引。但是这种方法有很大的局限性,使用不同架构的CPU去模拟另外一种架构CPU的运行,往往兼容性非常差,无法仿真在真实环境下系统的执行环境,用户必须在硬件平台上完成整个应用的开发。所以这种方法通常都用于实验性或者探索性研究,在实际的开发中很少使用。232内部电路仿真器调试方式内部电路仿真器INCIRCUITEMULATOR,ICE调试方式使用处理器内嵌的调试模块接管中断和异常的处理。用户通过设置CPU内部某个寄存器来使得某些中断或异常发生后处理器可以直接进入调试状态,而不必进入操作系统的处理程序。仿真器调试方式是在处理器的内部加入控制模块。当到达某些特定的条件时,被调试的程序暂时停止运行,宿主机的调试器通过与被调试系统的通信接口进行连接获取信息。典型的方式是通过JTAGJOINTTESTACTIONGROUP进行调试IL】。这种方法是在真实的目标机环境下进行测试的,所获得结果相比源程序模拟方式更加可靠。但是这种方案成本非常高,稳定的功能强大的仿真器价格非常高,而且CPU不能全速工作。虽然没有占用一个常用的通讯接口,但是却需要在开发板上额外设计一个JTAG接口,提高了成本。233操作系统问调试这种方案的典型例子是LINUX平台的GDBSERVER调试方式。这种方案是在宿主机上运行GDB,在目标机上运行GDBSERVER,然后主机端GDB与目标端GDBSERVER完成通信,进行调试。这种方案具有很大的局限性,根据GDB官方文档,GDBSERVER需要调用很多操作系统所提供的接口,运行GDBSERVER几乎相当于运行完整的GDB,而在资源有限的嵌入式系统上,实现可以支持GDBSERVER的类UNIX系统毫无疑闷是非常困难的。况且,如果目标端可以运行GDBSERVER或者GDB,便可以第二章嵌入式系统调试概述直接在目标机进行调试。所以这种调试方案通常用于两个类UNIX系统之间的应用程序级的调试19,。23,4驻留监控调试方式通过目标机与宿主机的协同,可以完成监控器调试的方式。软件插桩是在目标机上一段可执行代码,它与宿主机端的调试器一起完成对程序的调试。这种方式不需要在硬件上有额外的设备支持,节省了开发成本,但是在调试过程中,需要更多的软件支持,所以开发难度相比硬件调试桩复杂。但是如果完成了这种软件插桩调试方案,便很容易与其他方式相结合,扩展性非常强。缺点是在硬件调试完成后才能进行调试,同时需要占用目标板上的资源。本课题就使用这种方案IL“”L。24插桩调试器的选择通常,远程调试器是基于服务器,客户端模式实现的,由宿主机上的本地调试器、目标机上的调试服务器、远程调试协议三部分组成。本地调试器主要实现对源文件、目标文件和符号表的访问及处理,接收用户输入的调试命令,并根据远程调试协议封装成调试命令请求包,通过底层的通信功能发送给调试服务器,同时,接收调试服务器返回的调试信息,以获取目标程序的当前运行状态等。调试服务器负责监控被调试目标程序的运行状态,根据远程调试协议,接收并解析用户的远程调试命令,以获取目标程序当前运行的状态信息,并返回给用户。远程调试协议负责封装和解析调试命令和调试信息。远程调试会话的建立方式有两种方式一,目标程序出错后自动进入调试状态;方式二,由程序员在启动时主动进入调试状态。在第一种方式下,在目标系统运行的目标程序首先发生程序异常,进入异常中断程序,调试插桩程序将在目标系统的显示屏给出提示信息,询问是否要求调试目标程序。这时,如果要调试目标程序,可以在宿主机上启动本地调试器。被调试的目标程序将停在发生异常的机器指令上。在第二种方式下,程序员首先在宿主机上启动本地调试器,然后在目标操作系统的命令行状态下。输入系统内部命令以调试方式启动目标程序,被调试的目标程序将停在第一行可执行语句。同时实现这两种调试会话建立方式的方法在于,调试插桩程序在发送完第一个调试模块包后,进入等待应答状态,当超时未出现应答,重发第一个调试模块包。这样,如果是第一种方式,调试插桩程序将不停地发送第一个调试模块包,直到本地调试器被启动。如果是第二种方式,本地调试器将首先在守护状态,等待调试模块包,等到目标程序以调试方式启动之后,将在接收到第一个调试模块包时,建立调试会话。对于插桩调试方案,调试器的选择非常重要。目前,国外很多公司提供了调试器,包括WINDRIVER公司的SINGLESTEP,ARM公司的REALVIEW,以及GNU的ODB6青岛大学硕士学位论文等等。当然,我们也可以完全从头开发一种宿主机调试器与调试桩进行调试,也可以通过使用一种现成的调试器进行开发。两种方案各有利弊。1使用完全自主开发的调试器可以省去很多不需要的模块,甚至省去一些协议的移植以节省时间。但是这种方案的可移植性非常差,每次面对不同的目标平台,都需要自己根据目标平台的硬件架构进行重新开发,比如一个可以支持ARM的调试器,如果要调试POWERPC处理器,不但要移植软件调试桩,还需要调整宿主机的调试器分析架构。而且如果要实现源码级调试,调试器就必须要识别编译器所生成的调试信息,一个从零开发的调试器必须要完成对调试信息和符号表的识别。整个项目的工作量是非常可观的。2如果使用已经成熟的调试器,虽然要完成某些通信协议,使调试桩按照某种GDB安排好的方案去编写,但可以避免上述一些不必要的开发过程。例如使用GDBGNUDEBUGGER。GNU工具链之间可以无缝连接。通过GCC,ID生成的调试信息和本地符号表等,都可以在GDB中直接载入,通过与远程调试桩的通讯,从而实现源码级调试14LOJ。并且作为开源项目,有大量的文档可以使用,并且可以通过同其他开源程序相结合。用图形界面实现调试,例如ECLIPSE、DDD和GDBINSIGHT。基于上述优点,在本项目的研究过程中,将使用GDB作为调试器进行代码移植。7第三章GDB基本调试原理第三章GDB基本调试原理GDBGNUDEBUGGER是开放源代码的GNUGNUISNOTUNIX的调试器项目。GDB作为GNU的核心部分之一,为用户提供了强大的调试功能。GDB是GNU开发链的部分,支持多种平台,可以与GEE,TD等工具无缝链接,读取其中的调试信息,可以极大提高开发的效率。31GDB和GCC简介GDB是由自由软件基金会所支持的项目,起初是由RICHARDSTALLMAN所开发,后来很多开发人员在GDB的开放过程中作出了巨大贡献。作为GNU开发工具链中的核,IH,组件之一,运行于UNIX兼容环境下,通常都与GNU的C编译器GCC等工具联合使用,并且支持多种平台和开发语言。作为开源项目,我们可以深入到GDB的内部去研究其实现的方案,更深刻的了解其运行机制,并且可以根据自己的需求,于GDB的代码进行某些修改。图31GCC编译过程”W编译器的作用是将使用高级语言或者使用汇编语言所编写的程序代码编译成某种处理器上的指令。LINUX系统下的GEE是一种功能强大的跨平台编译器。GEE编译器可以将C、C、汇编程序和目标程序编译、链接成可执行文件,如图31所示。GEE在编译过程中,首先调用CPP进行预处理,在此过程中,需要分析预编译语句等信息。然后使用CCL进行编译,生成扩展名为O的目标文件。然后GEE会调用LD8青岛大学硕七学位论文来完成链接,按照某种安排好的格式,目标文件被置于某些特定的位置。在编译的过程中,可以使用多种参数,使用这些参数可以优化代码,规定编译警告,进行预处理,生成调试信息等。使用GCC对源文件进行编译的时候,可以使用G的参数,在S文件中插入汇编伪指令。这个过程是在C文件编译成S之后完成的插入的这些汇编伪指令就成为调试信息,这些调试信息然后会按照编译时候的参数,以特定的格式添加到目标文件中去,例如STABS、COFF和XCOFF。这样在使用GDB的过程中,便可以自动识别并抽取这些信息进行分析调试14,15】。在嵌入式开发过程中,通常使用交叉编译的方法,即负责开发和调试的宿主机和目标机使用不同的处理器架构。常见的宿主机架构是I386架构,也就是我们所使用的PC机架构,使用操作系统WINDOWS或者LINUX等,而目标端则使用基于ARM、MIPS或者POWERPC等架构的平台,这就是交叉编译。交叉编译是指程序在一台计算机上编译,然后把编译好可执行代码放到另一台计算机上运行。采用交叉编译是因为一般来说主机系统比目标系统要快得多,而且具有多得多的可用资源,这样在编译过程中可以获得更快的速度和更多的系统支持。基于同样的道理,嵌入式系统的调试器运行在主机系统上,而被调试的程序则运行在目标系统上。在本课题研究中,调试过程中,由宿主机端GDB与目标端的调试桩,使用REMOTESERIALPROTOCOL通过物理通讯介质进行信息交互,如图32所示。图32GDB远程调试模型32源码级调试技术原理程序运行过程中目标程序的指令代码和数据都映射到目标机上相对应的内存中,调试器利用目标文件中在程序编译链按时生成的调试信息来实现目标程序与源程序之间的映射,从而在源码级实现对程序执行情况的控制和观察。其关键在于找到数据和调试控制点在源程序与目标程序之间的映射关系。任何数据都有名和值两个方面,数据名与数据值之间的映射关系为根据数据名得到存放该数据值的内存地址,再从目标机的内存地址取出其内容即为数据值【161。调试中的程序控制点通常为源程序中的函数名或语句行,它们对应于装载到目9第三章GDB基本调试原理标内存中的相应目标代码,要实现程序的运行控制关键在于得到源代码与目标代码之间的映射关系;由源码定位信息得至4相应的目标码信息;由目标码地址得到相应的源码定位信息。源码定位信息为源文件名和行号或函数名;目标码信息为目标指令在目标机内存中的起始和终止地址。321ELF文件格式及调试信息的表示计算机体系中目标代码文件有多种格式,如PE、ELF、DWARF,COFF、AOUT等。其中ELF是广为使用的一种格式,其跨平台特性和广泛的支持使得ELFEXECUTABLEANDLINKABLEFORMAT格式逐渐成为一个商业标准【“1。可执行连接格式ELF是UNIX系统实验室USL作为应用程序二进制接121APPLICATIONBINARYINTERFACEABI而开发和发布的。工具接13标准委员会TIS选择了正在发展中的ELF标准作为在32位INTEL体系上不同操作系统之间可移植的二进制文件格式,目前ELF格式在开发中广泛使用。假定开发者定义了一个二进铝6接口集合,ELF标准用它来支持流线型的软件发展。应该减少不同执行接口的数量。因此可以减少重新编程重新编译的代码1121。链接视图ELF头程序头表可选SECTIONLSECTION2SEETIONN节头表执行视图ELF头程序头表SECTIONLSECTION2SECTIONN节头袭可选图33链接视图及执行视图ELF目标文件主要有三种类型,分别是1可重定位文件该文件保存的数据与代码适合与其它目标文件链接生成一个可执行文件或者共享目标文件。2可执行文件该文件保存的程序适合执行。该文件指定“EC形成一个程序的进程映像。10青岛大学硕士学位论文3共享目标文件共享目标文件有两个应用,第个就是LD可以将该文件与其它重定位文件或共享目标文件重新生成另外一个目标文件,第二个就是动态链接器与一个可执行文件或其它共享目标文件重新生成一个进程映像。通过汇编器与链接编辑器生成的程序的二进制表示的目标文件是可以在处理器上直接执行的。组织格式如图33所示。图中描述了重定位目标文件格式,共享文件和可执行文件格式视图。322ELF头的结构一个ELF头在文件的开始,保存了基本ELF信息,描述了该文件的结构和组织。它的成员有UNSIGNEDCHAREIDNET16;ELF文件信息ELF32HALFETYPE;表示目标文件的类型ELF32HALFE_MACHINE;表示目标文件所需的硬件体系架构ELF32WORDEVERSION;显示当前目标文件的版本号ELF32_ADDRE_ENTRY;显示程序开始执行的实际地址ELF32_OFFEPHOFF;程序头表在文件内的偏移量,以字节计ELF32OFFESHOFF;节头表的文件偏移量,以字节计ELF32_WORDE_FLAGS;显示特定处理器相关的标志位ELF32_HALFEEHSIZE;胍LF头的大小,以字节计ELF32_HALFE_PHENTSIZE;程序头表表项的大小,以字节计ELF32_HALFE_PHNUM;程序头表包含的表项数目ELF32IIALFESHENTSIZE;肺头表表项的大小,以字节计ELF32_HALFE_SHNMUM;节头表包含的表项数目ELF32_HALFE_SHSTRNDXL节名字符串表在节头表中的索引。EIDENT16部分内容解释如下E_IDNET03】目标文件格式标识。E_IDENT4目标文件所针对的目标机的位数。E_IDENT5目标文件的数据的存放方式EIAENT6目标文件的版本号EIDENT715】未定义,以零填充。323节头表结构节是从链接的视角上看问题的,含有大量的目标文件信息,包括指令,数据,第三章GDB基本调试原理还有符号表,重定位信息等。一个节头表SECTIONHEADERTABLE包含了描述文件SECTION的信息。每个SECTION在这个表中有一个入12;每个入口给出了该SECTION的名字,大小,等等信息。ELF32WORDSHNAME;标识该节节名在节名字符串表中的偏移量ELT32WORDSHTYPE节类型E1132WORDSHFLAGS节属性标志执行时该节可写否,装入时否需调入内存。是否包含可执行指令等等E1132ADDRSHADDR;如果该节需装入内存,此为节所在的内存起始地址E1132OFFSHOFFSET;该节在文件内的偏移量ELF32WORDSHSIZE;节的大小字节数E1132WORDSHLINK;依节类型而定ELF32WORDSHINFO;,依节类型而定E1132WORDSHADDRALIGII;,节地址对齐要求ELF32WORDSHENTSIZE如该节内容由定长的节项组成,则此值为节项大小字节数;324程序头表表项结构一个程序头表PROGRAMHEADERTABLE存在,那么其告诉系统如何来创建一个进程的内存映象。或者说被用来建立进程映象的文件必须要有一个程序头表O”】。一个可执行的或者共享目标文件的程序头表是一个结构数组,每项描述了一个段或者系统需要准备程序执行的其它信息。一个目标文件的段包含一个或者多个节,程序头只是对可执行文件与共享目标文件有意义,一个文件通过ELF头的E_PHENTISEZE和E来指定他的程序头大小。PHNUMTYPEDEFSTRUCTE1132一WORDP_TYPE;段类型E1132_OFFP_OFFSET;段位置相对于文件开始处的偏移量E1132ADDRPVADDR;段在内存中的地址E1F32ADDRPPAD;段的物理地址ELF32WORDP_FILESZ;段在文件中的长度E1F32WORDPMEMSZ;段在内存中的长度E1132WORDPFLAGS;段的标记E1132WORDP_ALIGN;段在内存中对齐标记12青岛大学硕士学位论文33STABS格式调试信息STABS是一种用来为调试器描述程序的格式。这种格式是由加州大学伯克利分校的PETERKESSLER提供的,最初是用来为PASCAL调试器提供服务的,现在这种格式已经用于其他调试器15,191。GNUC编译器将C源文件编译成为扩展名为S的汇编文件。然后汇编程序将S文件转换为O格式文件,然后连接器将S格式的文件和库文件合并在一起生成可执行文件。使用G的参数,GCC在S文件格式中加入了额外的调试信息,然后在汇编程序和连接器中经过转换后,加入到最终的可执行文件中。这些调试信息描述了源文件中的特征,包括行号、变量的类型和取值范围、函数名称、参数等信息。针对目标文件格式,汇编程序将调试信息以STAB格式进行封装,然后将这些调试信息分散的加入生成代码中。调试信息通常是以汇编的伪指令的形式出现的,并且和汇编指令语句融合在一起。GNU工具可以从COFF和ECOFF目标文件格式中提取STABS格式的调试信息。STABS主要以四种伪指令格式加入汇编代码,分别是;STABS“STRING”,TYPE,OTHER,DESC,VALUESTABNTYPE,OTHER,DESC,VALUESTABDTYPE,OTHER,DESCSTABX“STRING“,VALUE,TYPE,SDBTYPE在实际应用中,通常使用STABS和STABN格式的伪指令。STABS伪指令主要是为了标记源文件中的文件名、函数、变量等信息。STABN是为了标记源程序中的行号、程序块的结构等信息。对于STABN和STABD,是没有STRING参数的。对于STABD,VALUE域是固定不变的,并且值等于当前文件的位置。对于STABX,SDBTYPE的值总是为0。其他的值几乎是缺省为0。TYPE的数值给出了一些关于STAB类型的基本信息。每一种合法类型数字都定义了一种不同的STAB格式。而且,STAB格式定义了具体的解释方法、可能的VALUE取值范围、STRING、DESC或者VALUE当前的数值等。STABS和STABN伪指令格式中的TYLE字段为一从0到0XFF的整数值,该值决定了该条伪指令所表示的信息是否为STAB信息00XLF则为普通符号信息,否则为STABS信息,也决定了其余字段的内容。常见的与C语言有关的STABS信息类型定义及解释如下0X20NGSYM全局变量。0X24NFUN函数名或代码变量TEXT节。0X26NSTSYM赋了初值的静态变量DATA节0X28NLCSYM未赋初值的静态变量BSS节。0X2ANMAINMAIN函数标识。第三章GDB基本调试原理O【2CNROSYM位于只读段的变量。0X3ENOPT调试器选择。O【40NRSYM寄存器变量。0X44NSLINETEXT中的行号。0X46NDSLINEDATA节的行号。0X48NBSLINEBSS节中的行号。0X64NSO源文件名或路径名,VALUE值为对应目标代码的起始地址0XS0NLSYM;局部交量或类型标识。0X82NBINCL头文件调试信息开始0X84NSOL头文件名,其VALUE值为对应目标代码的起始地址。O【AONPSYM形参变量。0XA2NEINCL头文件调试信息结束。OXCONLBRAC源文件中个块的开始标识相当于C语言中的”OXC2NEXCL;该头文件已被前面的源文件包含,具体含义在下面的调试信息提取内容部分中会进一步进行解释。0XE0NRBRAC源文件中一个块的结束标识相当于C语言中的”。大多数调试信息都存在于STRING域中。STRING域的格式非常灵活,甚至一些STAB类型的STRING域仅包含一个名称。通常STRING域的格式如下NANLESYMBOLDESCRIPTORTYPEINFORMATIONNAME是符号的名称。当STAB代表了一个未命名对象时,NAME可以忽略。其中NAME是STABS调试信息表示的该符号的名字字符串,NAME可以为空串,这种情况表示该STABS是一个没有名字的对象。如”T1,OO,2”,代表的意思为定义类型10,0为指向类型O,2的指针。NAME中也可以包含“”,在C中表示一种类型在另一种类型中定义的情形。”后的SYMBOLDESCRIPTOR为一英文字母,它更具体的表示该符号是哪一种STABS信息符号。常见的SYMB01DESCRIPTOR定义如下F文件内函数相当与C语言中用关键词STATIC说明的函数。F全局函数。G全局变量。P函数参数。R寄存器变量。S文件内静态变量。T给内嵌类型命名。T给结构、联合、枚举等类型命名。14青岛大学硕士学位论文V函数体内的静态变量。,TYPEINFORMATION一般为表示某种类型的二元整数值对,或二元整数值对的形式。如果仅为整数,整数,表示直接指向该二元整数值对所代表的已定义的类型。否则表示定义一新类型,该新类型用该二元整数值对表示。下面以一个简单的C例子程序的调试信息内容来具体解释该格式的一些伪指令语句所表示的意义。33BFD结构BFD整体上简单地可分为前端和后端,这样做的目的主要出于可移植性的考虑,前端向应用层提供统一的调用接口,是与且标文件格式无关的,后端实现目标格式相关的部分,前端通过调用后端的相关函数实现真正的具体目标文件格式操作功能。所以如果要支持一种新嵌入式目标文件格式类似于UCLINUX支持的简化类COFF文件格式BFLT,就只要修改BFD的后端就行了F201。前端的结构和一些主要的功能是段操作,符号表处理,重定位管理,库操作,及其为了方便用的函数。后端涉及具体的文件格式操作方法的支持,典型的是AOUT,COFF,和DFBFD工作过程简述如下每当BINUTILS工具打开一个目标文件时,例如OBJDUMP,工具通过调用BFD库里相关目标文件格式的信息判定该文件的二进制格式。然后抽取库里相关例程的信息建立对应的二进制格式操作描述符表实际上诗歌函数指针表,有点象COM的VTABLE,利用这些指针,工具读取分析和操作该目标文件。在使用OBJCOPY操作,OBJDUMP读取、分析,READELF读取命令时,就依靠于BFD的功能。正如前面所涉及的,编译器连接器在处理目标文件符号表等时先会调用的端函数前端是统一和抽象的过程,然后通过后端处理具体文件格式的操作函数将符号表等相关信息写到输出文件,这些任务就是通过调用内存中的BFD描述符函数实现的20,2”。34MI接口GDB还为开发提供了必要的后台界面信息接口。一般应用可以使用用户接口USERINTERFACE。这种接口比较简单,提供的信息相对机器接口MACHINEINTERFACE更加简射22L。机器接口是专门为了研发集成开发环境时,将GDB与界面集成使用的。机器接口提供了更多的信息,可以作为调试过程中,集成开发环境界面同后台GDB进行信息交互和信息分析的接口。35小结本章对GDB进行源代码调试的原理和所需要的信息进行了介绍与分析。GDB作为远程调试的一个核心,将多个功能模块有机的组织在一起。GDB的核心中包含了GDB的基本运行机制以及框架的生成。其中非常重要的部分,是从开发人员提供第三章GDB基本调试原理的调试信息中抽取信息,这需要大量的外部支持,GNU开发工具链很好的为GDB进行了补充,使其可以很轻松的从ELF、BFD等文件中获得所需的信,皂T231。这也为源码级的调试提供了必要的支持。很多调试器无法支持源码级调试的最主要问题就是无法识别被调试程序的文件格式,无法从被调试文件中获得在编译过程中加入的信息。图34宿主机GDB工作原理如果要开发自主的调试器,相当大的工作量将会集中于这些海量信息的抽取上,这也是为何通常调试器都是使用GDB的一个重要原因。开发一个可以接收RSP协议信息,并且符合GDB基本机制并且提供相关接口给用户界面是GDB的基本功能,但是要实现多格式、多平台的信息抽取,则很难摆脱GNU工具链的依赖。在GDB的实际使用过程中,如果GDB无法找到本地调试信息,包括符号表等,则无法实现源码级调试1241。这也说明了GDB在远程调试过程中,不仅需要借助于通讯介质同远程目标板获得调试信息,还需要对照本地调试信息才能完成调试,如图34所示。在调试过程中使用一个简单的SHELL客户端程序是可行的。但是在有些情况下,用户要求在图形界面中获季导更加友好的调试环境。GNU专门为GDB提供了GDBINSIGHT图形界面供调试使用【2”。ECLIPSE和KDEVELOP开发套件也可以使用GDB机器接口进行集成开发环境的设计。16第四章GDB远程调试的实现及原理分析第四章GDB远程调试的实现及原理分析ODB是GNU体系下的开源项目,最初是以X86为开发平台。所以对于X86平台下GDB进行分析可以更好的理解GDB远程调试的原理。同时,GDB官方文档建议使用SPARC处理器范例进行研究,因为SPARC处理器的远程调试桩编写更加规范。所以我们在此通过SPARC和X86平台进行对比分析,并具体根据X86平台的实现方法,抽象出一般GDB远程调试的一般步骤和方法,提供给ARM平台作为移植的框架。41跨平台调试环境函数模块分析表41SPARC及I386函数功能对比函数名称SPARCV81386备注PUTDEBUGCHAR有有外部提供GETDEBUGCHAR有有外部提供异常处理函数,STUB初始HANDLE_EXCEPTION有有化,依赖于平台SET_DEBUG_TRAPS有有STUB初始化函数,依赖平台BREAKPOINT有有断点函数,完全依赖平台体系陷阱号与系统信号转COMPUTESIGNAL有有换,基本一致HEXTOINT有有完全一致MEM2HEX有有基本一致HEX2MEM有有基本一致PUTPAEKET有有完全一致GETPAEKET有有完全一致HEX有有完全一致EXCEPTIONHANDLER有间接调用有基本一致SET_MERE_FAULT_TRAP有无有TRAP_LOW有间接调用无I386有类似实现RETURN_TO_PROG无有SPARC有类似功能SAVE_REGISTERS无有SPARC有类似功能CALL_HOOK无有无_CATCHEXEEPTION3X无有无17青岛大学硕士学位论文通过对比,我们可以基本总结出GDB实现远程调用所需要的几个重要功能模块。通信模块SETDEBUGCHAR,GETDEBUGCHAR,PUTPACKET,GETPACKET异常机制及处理模块SET_DEBUGTRAPS,COMPUTERSIGNAL,HANDLE_EXCEPTION,EXEEPTIONHANDLER断点生成模块BREAKPOINT环境保存及恢复模块SAVEREGISTERS,RETUMTOPROG格式转换模块HEX,HEX2INT,HEX2MEM,MEM2HEX其中通信模块是依赖于具体通信介质的。异常机制及处理模块,断点生成和环境保存恢复模块是依赖于平台的。格式转换模块是独立的,可直接重用,如表41所示。4,2函数功能分析函数名GETDEBUGCHAR功能从串口获得一个字符,跟目标机相关,需要外部提供支持。函数名PUTDEBUGCHAR功能向串口写一个字符,跟目标机相关,需要外部提供支持。函数名EXEEPTIONHANDLER功能异常分配函数,通过此函数,将异常向量号,指向具体的地址,当异常产生时,STUB就可以自动去分配的地址处取指令执行。完全不可移植。函数名SETDEBUGTRAP功能初始化程序,当被调试程序中止的时候,按照SET_DEBUG_TRAP分配的HANDLE_EXCEPTION函数进行操作。需要被安排在程序的前端执行。备注结构基本一致,调用EXEEPTIONHANDLER函数分配异常处理函数,具体对应机制不可移植,平台依赖。函数名HANDLE_EXCEPTION功能异常处理函数,处理异常向量号。1显示基本信息I选2计算向量号VECTORNUMBERUNIX可感知信号SIGVAL3通知主机异常已经发生4从主机等待命令5接收来自串口的数据包,并进行解析执行部分处理代码可移植6向主机返回信息依赖于平台,需要重新编写。第四章GDB远程调试的实现及原理分析函数名BREAKPOINT功能断点产生命令,通过BREAKPOINT函数,可以产生一个异常,使得主机GDB获得控制权。完全平台依赖。函数名PUTPACKET功能把包发送到缓冲区,可完全移植。函数名GETPACKET功能从缓冲区获得包,可完全移植。函数名HEX2INT功能把十六进制数转换为INT类型,可完全移植。函数名HEX功能把十六进制字符转换为INT类型,可完全移植。函数名MEM2HEX功能把内存地址中的二进制数转换为缓冲区的十六进制数,基本可以移植。函数名HEX2MEM功能把缓冲区的十六进制数转换为内存地址的二进制数,基本可以移植。函数名COMPUTESIGNAL功能完成平台陷阱号与UNIX可以识别的系统号的转换,不可移植。另外根据对GDB所实现的基于I386以及SPARC的STUB,可能还有一些辅助函数,比如保存环境,回复程序状态,设置内存报错等,在移植时需要注意根据具体平台的运行特性来实现系统保护措施。以下是移植的主要工作1实现GETDEBUGCHAR,PUTDEBUGCHAR,EXCEPTIONHANDLER,MEMSET,FLUSH_I_CACHE,以及RSP协议。2把BREAKPOINT函数放到被调试程序的开始位置。3将外部提供的子程序,调试桩代码以及被调试程序一起编译链接。4保证主机GDB与目标机的串口连接。5下载程序到目标机上,并启动。6在主机启动GDB,连接到目标机。19青岛大学硕士学位论文被调试程序开始执行弓被调试程序首先执行BREAKPOINTL函数之多被调试函数停止,切换状态之弓进入异常处理函数,保存现场弓进入信息处理函数之弓接收RSP协议包并进行处理之弓处理完成,返回异常处理函数,恢复现场图41GDB远程调试桩运行流程二使用GCC编译程序时。将远程调试源代码和被调试程序放在一起编译,以便被调试程序调用远程调试程序的代码,并且使用G参数,加入调试信息供GDB使用。三。将代码烧入目标机,上电运行。四程序执行至BRE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年能源行业智能电网在电力系统智能化升级中的应用报告
- 2025年进厂打工测试题及答案
- 机械伤害考试题及答案
- 2025年中级经济师经济基础题库及答案
- 2025年应急急救知识试题卷与答案
- 2025年职业病防治考试试题及答案
- 教学结合型的多媒体课件
- 毛概主题课件
- 毛巾行业知识培训总结
- 毛巾纺织基本知识培训课件
- DB32-T 4281-2022 江苏省建筑工程施工现场专业人员配备标准
- GB/T 618-2006化学试剂结晶点测定通用方法
- GB/T 28799.2-2020冷热水用耐热聚乙烯(PE-RT)管道系统第2部分:管材
- 办公室工作手册(国企、事业单位版本)
- 警械使用课件
- 英语词汇学教程-全套课件-
- 儿童气管插管医学课件
- 建筑工程从数字化建造到智慧
- 文化创意产品设计及案例PPT完整全套教学课件
- 五年级上册英语课件-Unit1 Goldilocks and the three bears第四课时|译林版(三起) (共18张PPT)
- 水利工程安全防洪度汛专项方案-版
评论
0/150
提交评论