基于Eclipse的嵌入式软件交叉调试

时间:2024-12-26 23:17:06 来源:作文网 作者:管理员

摘 要: 在嵌入式软件开发过程中调试占据很重要的位置。在详细分析Eclipse,CDT和GDB的特征后,扩展CDT的调试服务框架及其扩展点,实现在宿主机/目标机的开发模式中使用交叉GDB进行嵌入式软件的源代码级交叉调试软件。该交叉调试软件使用Eclipse作为集成开发环境,集成并扩展CDT插件,在宿主机端解析、加载带调试信息的目标文件,启动交叉GDB处理用户的调试操作,通过目标机服务器把经过封装的调试命令发给目标机执行,完成调试功能。该交叉调试方式支持通用的调试操作如设置/删除断点、源代码级或汇编级单步执行、连续执行目标程序、查看/修改目标程序变量、寄存器、内存和查看表达式等,以全软件的方式解决了嵌入式软件开发调试比较困难的、代价高的问题,加快了嵌入式软件开发周期。

关键词: 交叉调试; Eclipse; CDT; GDB; 嵌入式软件

Cross?debugging of Eclipse?based embedded software

TIAN Dan, LI Yun?xi, HU Ning, MAI Xian?gen

(The Third Laboratory of ACTRI, AVIC, Xi’an 710068, China)

Abstract: Based on the detailed analysis of the characteristics of Eclipse, CDT and GDB, the debugging service framework of CDT and its extension point was extended, and the cross debugging of embedded software in the source code level was realized by cross GDB used in development mode of host/target computer. Eclipse is adopted in the cross debugging software as the integrated development environment to integrate and expand the CDT plug?in, parse and load the object file with debugging information at host machine end, start the cross GDB to process the debugging operation of users, and sent the packed debugging command to the target machine through the target server to complete the debugging functions. The cross debugging mode supports universal debugging operations such as breakpoint setting/deletion, single step execution in source code level or assembly level, continuous execution of the target program, check/edition of object program variables, register, memory and expression check. It solved the difficulty in the process of embedded software development and debugging in the whole software mode, reduced its☂ cost, and accelerate the development cycle of embedded software.

Keywords: cross?debugging; Eclipse; CDT; GDB; embedded software

0 引 言

开发任何一个软件都不可避免地存在各种错误,通常程序员利用调试器来跟踪程序执行情况,定位错误产生的位置,找到引起错误的原因,最终改正错误。一般来说,调试器的主要功能是控制目标程序执行过程,查看、修改目标程序对象,包括在目标程序中设置删除断点;源代码级或汇编级单步执行、连续执行目标程序;查看、修改目标程序变量、寄存器和内存等。嵌入式软件调试通常采用宿主机/目标机模式,借助通用计算机作为宿主机,在宿主机上编辑源代码,使用交叉编译器编译生成目标机的可执行代码,通过通信介质将目标代码下载到目标机上运行,使用交叉调试器进行跟踪调试,其一般通用结构见图1。

E:\王芳\现代电子技术201506\现代电子技术15年38卷第6期\Image\44T1.tif

图1 交叉调试结构

国外计算机业在嵌入式软件调试领域发展很快,开发出多款功能强大、支持多种目标机的交叉调试器。目前国内的嵌入式系统发展迅速,对嵌入式软件的开发环境也提出了新的要求,因此在此着手进行嵌入式软件的源代码级交叉调试器的设计与实现。 1 Eclipse、CDT和GDB

GDB是GNU提供的开放源代码的源代码级调试工具,可以用于C/C++等程序的跟踪调试[4]。在嵌人式系统开发软件中, 开发人员能够使用GDB以远程调试的方式单步执行目标平台上的程序代码、设置断点、查看内存, 和目标平台交换信息。GDB同目标机交换信息的能力相当强大, 胜过绝大多数的商业调试工具, 甚至可以与某些低端仿真器媲美。同样, 与打印输出等传统的软件调试手段相比, GDB远程调试的动态、实时、方便等方面的优势非常明显。

CDT是在Eclipse平台上支持C/C++开发的工具插件,支持创建、编辑、资源管理、编译、运行和调试本地C/C++程序[5]。CDT由一组相关联插件组成,每个插件都作为一个独立自主的项目运行。

CDT的本地调试大致分为3步:

(1) 初始化运行环境。CDT需要初始化运行环境、设置被调试的目标文件、设置调试入口、确定源代码位置和查找规则、设置和GDB调试器的通信链接参数等。启动调试会话后, CDT创建并初始化调试对象、线程信息、断点信息、寄存器信息、内存信息、源代码信息等;

(2) 启动GDB调试器。CDT以图形化的方式提供调试功能, 但底层仍然采用传统调试器GDB。CDT 使用MI接口启动GDB,每一条发给GDB的调试命令都会有返回信息。CDT启动GDB输出流监听线程,该线程负责通过MI协议与GDB通信并完成事件触发任务。CDT中图形界面的变化是通过接收并解。析这些信息而产生的;

(3) 开始调试。用户发出调试命令后,CDT首先检测被调试对象的状态, 如此时对象已经运行则抛出异常(如被挂起), 并向GDB发出continue命令;如被终止或没有运行, 则向GDB发出run命令,运行调试对象, 直到触发事件。当有事件被触发, CDT将收集事件发生时的目标机现场,根据该现场决定被调试的线程、断点位置、源代码位置以及目标机对象信息, 并反馈给用户,用户可执行下一条的调试命令,CDT通过MI 接口将具体的调试命令传递给GDB执行,依次循环直至完成本次调试。

CDT的调试支持部分包括CDT调试核心、CDT调试UI、CDT调试MI和 CDT调试启动等插件,通过扩展上述插件,可启动交叉调试器GDB,实现对远程目标机程序的源代码级交叉调试功能。

根据Eclipse、CDT以及GDB的以上功能特性,以Eclipse为交叉调试环境基础平台,调用CDT调试服务框架,扩展调试相关功能,将嵌入式交叉工具链无缝集成到交叉调试环境基础平台中。

2 交叉调试组成结构

交叉调试由CDT交叉调试支持、目标机服务器通信支持和交叉GDB,如图2所示。CDT交叉调试扩展CDT的调试扩展服务,调用交叉GDB,提供远程交叉调试支持。

图2 交叉调试组成图

2.1 CDT交叉调试

CDT调试覆盖基本的调试工具,包括调试启动、调试视图、断点视图、表达式视图、变量视图、反汇编视图、内存视图和源码编辑器等。调试启动管理调试启动配置。调试视图管理调试会话,显示调试栈帧,提供调试操作。断点视图提供调试断点管理功能,包括设置、删除、关闭和打开断点等操作。变量视图提供局部变量和全局变量操作功能。寄存器视图提供寄存器✄操作功能,在多核条件下,支持查看不同核上的寄存器。内存视图提供内存操作。表达式视图提供表达式求值功能。反汇编视图支持反汇编调试。源码编辑器提供源代码级调试。

交叉调试扩展CDT,实现两个新的插件:cross.debug.core和cross.debug.ui。cross.debug.core需要扩展命令工厂扩展点,实现交叉调试命令集;扩展调试器扩展点,启动交叉调试GDB;实现符号表管理器,提供脱离GDB的符号表查询接口,在GDB没有启动的情况下(如加载时)查询符号地址;扩展调试启动器扩展点,链接目标机服务器,根据调试类型加载目标文件。cross.debug.ui插件扩展调试运行类型扩展点, 为支持的嵌入式操作系统添加专有的调试运行类型组,与该嵌入式操作系统相关的调试启动归属于这个组;扩展调试器配置页扩展点,配置调试参数如选择目标机服务器、调试初始入口和加载配置等。

2.2 目标机服务器通信支持

目标机服务器用于管理宿主机与目标机之间的通信链接,是嵌入式软件集成开发环境与目标机的通信中心。目标机服务器可以管理多个目标机,同时向多个目标机发送数据,可以同时接收多个目标机的数据。目标机服务器将开发环境中所有和目标机通信相关统一管理,并为开发工 具提供目标机通信接口。 目标机服务器提供目标机管理、数据传输、目标机通信、目标机通信连接检查、命令管理、目标机事件管理、RSP数据处理、符号表管理、日志记录等功能。

2.3 交叉GDB

交叉GDB提供不同体系结构目标机系统的远程调试支持,在调试启动配置中可以选择不同版本的交叉GDB。GDB和目标机服务器之间接口是MI协议。目标机服务器把MI协议命令转化为RSP协议,发给目标机代理处理。

3 交叉调试工作流程

交叉调试设计为远程调试模式,与CDT本地调试有所不同,交叉调试需要与待目标机的体系结构相符的交叉调试GDB;交叉调试需要和远程目标机通信,这由目标机服务器负责;调试命令由GDB发给目标机服务器,返回信息由目标机服务器传给GDB,再由CDT界面显示。

交叉调试基本步骤为:

(1) 初始化目标机系统,建立宿主机与待调试目标机之间的通信通道,加载运行被调试的目标文件到目标机中;

(2) 启动交叉调试器。确定宿主机中和目标机上所运行程序对应的包含调试信息的目标文件,然后启动宿主机上和目标机体系结构匹配的交叉调试器GDB,建立该交叉调试器和目标机服务器的通信链接,以后的调试命令通过该通信链接向目标机发送命令并接收目标机返回的信息;

(3) 初始化交叉调试运行环境,建立交叉调试会话。启动交叉调试会话后,CDT创建并初始化调试对象、 远程目标机中的线程信息、断点信息、寄存器信息、内存信息、源代码信息等;

(4) 开始交叉调试。该过程与CDT的本地调试步骤(3)类似,GDB收到MI调试命令后,转换为远程串行协议(Remote Serial Protocol,RSP)命令,发给目标机服务器;目标机服务器将RSP命令发送给目标机执行,并接收目标机返回的执行结果信息和目标机程序执行中触发事件,送给GDB处理;GDB收到目标机报告的数据,转换为MI命令回复交给CDT;CDT根据MI命令回复ห确定该调试命令的执行结果。

4 关键技术

4.1 符号表管理技术

符号表是源码级调试的必要功能。在本地调试过程中,由GDB管理符号表并提供查询接口。交叉调试时,可能GDB尚未启动,或者不具备查询状态,不能从GDB获得符号信息,需要调用脱离GCC工具链和GDB的符号表解析程序。解析程序包含4部分:Symbol类、Se☁ction类、ElfHeaher类、Elf类和符号表管理类SymbolManager。

Symbol类描述符号相关信息,包括符号名字、符号地址、符号类型以及符号所属段等数据。

Section类描述段相关信息,包括段名字、段类型、段属性、装入地址和段偏移及大小等数据。

ElfHeaher类描述Elf文件头信息,包括文件类型、目标体系类型、处理器标识、文件入口地址、Elf头偏移及大小、段表信息等数据。

Elf类解析带有调试信息的目标文件信息,创建相关信息对象:一个ElfHeader对象、一组Section对象和一组Symbol对象。

SymbolManager类提供设置符号文件、根据源代码行号查地址、根据地址查源代码行号、根据地址查符号、根据符号查地址以及获得指定段等接口。

4.2 CDT调试扩展技术

交叉调试对CDT调试的扩展主要是在建立和目标机服务器的通信链接,启动并初始化支持交叉调试的GDB方面,主要包括以下方面:

(1) 扩展交叉调试命令集实现CrossCommandFactory。CDT默认的调试命令集包含GDB的MI命令和部分CLI命令,需要加入新的命令如增加符号文件、根据源代码行号查地址命令、根据地址查符号以及根据符号查地址等命令;

(2) 扩展交叉调试器实现CrossDebugger。启动交叉调试器需要找到符合目标机体系结构的GDB,添加符号表文件,把CDT建立的本地调试对象Target转换为交叉调试对象CrossTarget以记录远程目标机的调试上下文,维护调试会话使用的目标机服务器链接等参数;

(3) 扩展交叉调试器配置实现CrossDebuggerPage。在调试启动配置中添加交叉调试需要的参数配置界面;

(4) 扩展交叉调试器启动代理实现CrossLaunchDelegate。根据配置链接目标机服务器指定要调试的目标机,加载待调试程序到目标机;还有可能需要重定位目标文件、设置所调试程序参数;根据配置启动交叉调试器,创建调试会话,初始化源代码查找器。

5 结 语

本文主要研究以开源的Eclipse和CDT 项目为依托,在分析Eclipse、CDT和GDB的功能特性的基础上,根据CDT的扩展服务,实现在宿主机上利用交叉调试GDB,调试远程目标机程序的源代码级交叉调试功能。该交叉调试支持通用的调试操作如设置删除断点、源代码级或汇编级单步执行、连续执行目标程序、查看/修改目标程序变量、寄存器、内存和查看表达式等。进一步,在嵌入式软件开发阶段,开发者必须要对目标系统运行状态具有完全的观察和控制能力, 例如硬件的各种寄存器、内存空间使用情况、CPU利用率, 操作系统的信号量、消息队列、任务、堆栈等对象和系统任务之间的通信情况、任务的执行轨迹,这将是进一步的工作。

参考文献

[2] 魏楚元,李陶深,张增芳.Eclipse:基于插件的下一代通用集成开发环境[J].计算机应用与软件,2005,22(6):38?40.


热门排行: 教你如何写建议书