新闻中心

EEPW首页>嵌入式系统>设计应用> 基于ELF的嵌入式软件源码级交叉调试技术

基于ELF的嵌入式软件源码级交叉调试技术

作者: 时间:2012-03-20 来源:网络 收藏

用机器单步执行时,每执行完一条机器指令立即读取当前PC,判断程序停止位置。调试器对程序的控制是即时交互的,当单步执行结束、跳转或进入函数调用时,调试器都会即时得知。不采用机器单步,则不具有这种即时掌握程序运行状态的便利,需要在运行前反汇编目标代码,通过分析汇编指令预测程序单步执行可能的出口位置,并在该处设上断点。可能的出口位置包括该行指令的终止地址、跳转、分枝跳转、函数调用等指令。对于跳转指令,能得到绝对地址则直接在跳转地址处设断点,不能得到跳转地址则在指令处设断点,再执行跳转指令由当前PC值确定程序停止的位置。对于函数调用指令,如果采用单步跳过(stepover)方式,则将其作为普通指令看待,直接执行调用函数;如果采用单步进入(stepinto)方式,则需在指令处设断点,再执行调用指令,以进入函数内部让用户继续跟踪程序的执行。

以单步跳出方式(stepout)执行程序时,以子程序为单位,需执行完当前子程序的所有代码,在调用该子程序的下一条语句处停止。通过反汇编当前子程序的所有指令,可得到该子程序所有可能的函数返回出口,在这些函数返回指令处设临时断点,程序运行到断点处再执行该返回指令跳出当前子程序,处理调用该子程序的语句行的后继信息,最终确定程序停止位置。

5、数据浏览

数据与指令同样是构成程序的根本。数据类型繁多,不同的类型处理起来有所不同,其基本原理是由数据名找到存放该数据的地址,再从地址中取出数据的值。关键在于找到名与地址的映射关系。这些信息可从.debug,.symtab等节中得到。全局变量一般可得到直接的地址信息,而局部变量采用堆栈方式存放在内存中,需根据从.debug中得到的该变量在堆栈中的位置信息来确定地址。采用表结构来管理变量,将每个变量的名、地址等信息登记在表中,将对数据值的操作转化为对相应地址的内存单元操作,如查看变量即为读取该变量所在内存单元的内容。

5 交叉调试器JDBG简述

JDBG采用图形用户界面,相应的命令提供图形按钮或菜单,并提供快捷键。进入调试之前,先连接目标机,在连接时设置连接参数并保存,在以后的连接中可直接使用已保存的设置参数。当宿主机/目标机处于连接状态时,下载目标文件,启动调试器。调试器启动后,用户可在打开的源文件中设置断点,运行下载的目标程序,查看/修改寄存器、内存的内容。当运行的目标程序停止后,返回停止点源码信息,用户可以观察数据,添加新的断点或删除已设断点,控制程序的单步执行或连续执行,或退出调试状态。

JDBG的功能流程如图5所示:

6结束语

本调试器采用基于目标文件分析的实现方案,以remote协议作为宿主机/目标机通讯协议,具有很大的扩充性,可扩展为多语言多机器调试器,并可扩展为目标模块级的动态下载与调试,这正是我们下一步的研究内容。

参考文献

[1] Jonathan B.Rosenberg.How Debuggers Work,New York:Wiley Computer Publishing,1996

[2] Beatrice Lazzerini. Lanfranco Lopriore.Program debugging environments:design and utilization,New York: Ellis Horwood,1992

[3] 杨均 熊玲青 谢汉东.UNIX系统V第4版 程序员指南:ANSI C和编程支持工具,北京:电子工业出版社,1992

[4] the GDB developers.GDB Remote Serial Protocol,1988-2002 Free Software Foundation, Inc


上一页 1 2 3 下一页

评论


技术专区

关闭