基于ELF的嵌入式软件源码级交叉调试技术
.line节中包含目标代码地址与源代码行号之间的对应关系。对每个编译单元给出其行记录信息的长度和目标码的起始基地址,以及该编译单元中所有的行记录,每条记录以固定的格式表示:“该行目标码相对于基地址的偏移,列号(保留,暂未使用),行号”。
综合上述程序段和节的内容,即可确定源码与目标码的映射关系。如给定一个文件名及行号,确定其目标代码的信息。首先根据文件名确定其在.debug 节中的编译模块信息,从中可得该文件模块的起始终止地址;再由其起始地址找到该编译模块的行记录信息在.line节中的位置,根据行号找到行记录,得到该行目标码的地址范围;由这些地址信息,可直接从目标机内存中取得目标代码,也可结合程序段信息从目标文件的程序段中取得该行所对应的目标代码指令内容。调试器利用地址与指令信息就可以查看、修改、执行相应目标代码,供用户进行调试。
4 源码级交叉调试器实现的技术要点
在设计交叉调试器JDBG时,首先完成与目标文件无关的部分:连接目标机,查看修改目标机寄存器和内存;然后实现与目标文件有关的部分:下载目标文件到目标机,源码级调试功能,包括断点控制、执行控制、变量观察等,以下重点讨论各项功能的设计与实现。
1、下载目标文件
目标文件中包含多种类型的内容,目标程序在目标机上运行时只需要程序的二进制指令代码与相关数据,这些内容包含在文件中的可执行程序段中。下载目标文件时在宿主机上提取目标文件中的代码与数据段,根据其地址映射关系利用remote协议中写内存的功能在目标机上建立程序的远程映像。
2、断点
断点是调试器控制程序执行的基本手段。各种机器有其特殊的断点指令(如X86的int3指令),设置断点就是将机器断点指令替换所指定程序单元中的指令,使得程序运行到断点指令处时,产生“断点异常”,用户程序不再继续执行下去,目标机向宿主机返回断点停止信号,由宿主机调试器接管对用户程序的控制。
断点分为逻辑断点与物理断点,两者是多对一的关系。逻辑断点与源代码对应,提供源级断点信息(源文件名+行号或物理地址等);物理断点与目标码对应,提供断点的目标码地址及断点处的指令内容。插入一个断点即根据逻辑断点信息确定物理断点地址,将该地址对应指令用机器断点指令替代;删除断点即恢复断点指令处预先保存的原指令,使得程序可继续执行。
检查点是一种条件断点,使程序在条件满足时停止执行。通常条件都涉及表达式的值变化,利用写内存保护来检查表达式的值是最常用的方法,但这种方法不适用于不具备MMU功能的处理器。某些处理器(如i386)提供了专门的调试控制寄存器,通过在调试控制寄存器中设置相应线性地址及中止条件(读或写)即可中止程序的运行。通过查询方式检查表达式的值也是一种可行的方法,其效率相对较低。当检查点的条件满足时,检查点的操作与普通断点类似。
对一个断点应具有基本的插入、删除、使能、使不能等基本操作功能。在设计中采用双向链表结构作为断点的数据结构,使得断点控制更加方便高效。
3、启动程序运行
启动程序运行首先从目标文件的ELF头中得到应用程序的入口,将目标机的PC寄存器置为该入口地址,从入口处开始执行程序指令。如果程序中没有设置任何断点或检查点,则程序一直运行到结束;如果程序
交叉调试器嵌入式软件ELF 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)