论文部分内容阅读
GNU调试器(GNU Debugger, GDB)是一个开源的源代码级的调试工具,其性能优良、功能齐全、易于使用,在嵌入式系统开发过程中扮演着越来越重要的角色。总结其优点包括:良好的跨平台特性;支持远程调试;支持指令级、函数级的控制,包括单步、跳转、返回等,支持对寄存器的读/写操作,支持条件断点/硬件断点;支持内核调试和应用程序级别的调试;支持对多线程/多进程的控制。在linux/Unix内核的嵌入式开发平台中,会自带GDB调试方案,可以直接使用。那么在采用其它RTOS的嵌入式平台上,GDB调试方案是否有机会发挥作用呢?本文探讨了在ARM体系架构的硬件平台上,非linux/Unix内核的情况下,使用GDB调试方案对目标平台程序进行调试的方法。嵌入式开发平台的GDB调试方案由两部分组成,一部分是运行在主机端的GDB调试器,一部分是集成在目标端的GDB-stub。通常而言,GDB调试器和GDB-stub可以通过串口、并口或者高速以太网口相连接,在本项目中选择的接口是嵌入式平台中最为常见的串口。从GDB调试方案的组成来看,本项目需要完成编译GDB调试器和实现GDB-stub;除了这两部分以外,GDB调试方案还需要对目标平台系统进行一些必要的修改。这些修改包括在目标系统启动的过程中设置一个自陷程序,以便GDB-stub获得目标系统的控制权,并开始和GDB调试器会话;修改系统的异常向量表,以便存储异常发生时的现场。GDB调试器可以通过下载源代码包,针对ARM进行配置后,重新编译得到。GDB-stub的实现比较复杂,从其功能来说,它是GDB调试器在目标平台的代理,负责按照GDB调试器的“吩咐”操作目标平台的寄存器、内存等。在通信接口选定为串口的前提下,GDB调试器和GDB-stub通过GDB远程串行协议进行通信。GDB远程串行协议是一种基于消息的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码)协议,它包含了诸如读写内存、查询寄存器、运行程序等命令。本项目coding部分的主要工作就是实现GDB-stub以及对目标平台系统的修改,这就要求深入学习ARM体系结构及特征,特别是要学习ARM1156T2-S的特点,掌握异常处理原理及过程。这部分的代码量虽然不大,但却是本项目的难点和精髓所在,也是本项目中作者需要创新的部分。本文首先介绍了GDB远程调试的原理,接着详细说明了下载GDB调试器源代码包,并在linux服务器上编译针对ARM体系结构GDB调试器的详细步骤。然后分析了ARM体系结构特点,包括7种运行模式,37个寄存器,程序状态寄存器,以及异常中断处理过程。最后讲述了在目标平台上,实现GDB-stub.启动自陷程序以及异常向量表的修改,从而实现完整的GDB调试方案,并进行测试。本文探讨了在ARM系统平台上,采用实时操作系统(Real-TimeOperating System, RTOS)内核的情况下,一种用GDB调试方案对目标平台进行除错的思路。该调试方案可以极大的提高开发人员的开发效率,从而有效的降低整个项目的开发成本;同时,也为其它项目采用类似平台时,提供了一个porting GDB调试方案的借鉴。