龙空技术网

基于飞腾FT2000/4处理器的GDB远程调试实现

程序猿的未来人生 316

前言:

今天咱们对“ubuntuarmlinuxgdb”大约比较讲究,兄弟们都想要了解一些“ubuntuarmlinuxgdb”的相关文章。那么小编也在网摘上汇集了一些关于“ubuntuarmlinuxgdb””的相关内容,希望看官们能喜欢,我们快快来学习一下吧!

GDB远程调试环境由宿主机GDB和目标机调试代理共同构成,两者通过串口或TCP连接。使用GDB标准远程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试代理是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。目标机调试代理需要实现GDB标准远程通信协议中的部分消息包,主要包括读内存、写内存、读所有寄存器、读单个寄存器,写所有寄存器、写单个寄存器、设置断点、删除断点、运行、单步等。

GDB标准远程通信协议

所有GDB命令和响应以包的形式发送。包以起始字符 $、实际数据包数据、终止字符#和两位校验和组成,其格式如下:

-> $packet-data#checksum<- + 

当主机或目标机器接收到数据包时,第一个响应是一个确认包:“+”(表示已正确接收到包)或者“-”(请求重传)。

调试代理至少需要支持以下命令,所有其他命令都是可选的,具体命令格式及其详细描述可参考GDB手册的《Appendix E gdb Remote Serial Protocol 》章节:

? 目标机暂停原因g 读取所有通用寄存器m(m addr,length) 内存访问命令Z(Z type,addr,kind) 插入断点命令,其中Z0,addr,kind 表示插入软件断点z(z type,addr,kind) 删除断点命令,其中z0,addr,kind表示删除软件断点c 运行控制s 单步命令,如果目标体系结构支持硬件辅助单步执行则实现该命令 vCont 支持多线程调试应该支持“vCont”命令ARCH32调试寄存器上下文

GDB源码的gdb\features\arm路径有相关调试寄存器上下描述文信息。主要包括核心寄存器arm-core.xml和浮点寄存器arm-vfpv3.xml。注意:其中cpsr寄存器号不是16而是25,因为历史原因16-24为fpa浮点相关寄存器。

软件断点

ARM的调试断点指令为BKPT(指令码:E1200070),其产生的调试异常为(Prefetch Abort)。软件点读调试相关章节《G2.8.1 About Breakpoint Instruction exceptions》。观察点的调试异常为(Data Abort)。

硬件断点

Armv8-A架构提供2-16个硬件断点,DBGDIDR. BRPs展示硬件实现的硬件断点数量。DBGDIDR(G8.3.11 DBGDIDR, Debug ID Register)寄存器指定要实现的调试体系结构以及调试功能。

WRPs:观察点数量,值0为保留。如果为0b0001则表示有2个观察点,0b1111表示有16个个观察点,其提供2-16个观察点。

BRPs:硬件断点,,值0为保留。如果为0b0001则表示有2个观察点,0b1111表示有16个个观察点,其提供2-16个硬件断点。

要使用已实现的硬件断点,调试器将为断点编程以下寄存器:

断点控制寄存器DBGBCR<n>。它包含断点的控制,例如使能硬件断点。 断点值寄存器DBGBVR<n>。它保存一个用于断点匹配的值,指令虚拟地址。

硬件断点控制寄存器DBGBCR<n>,控制硬件断点的使能。

观察点

硬件实现可以包括2-16个观察点。DBGDIDR.WRPs展示硬件实现的观察点数量。要使用已实现的观察点,调试器需要观察点编程以下寄存器:

观察点控制寄存器DBGWCR<n>。它保存了观察点的控制信息,如启用观察点。观察点值寄存器DBGWVR<n>。它保存用于监视点的数据虚拟地址匹配。

观察点控制寄存器DBGWCR<n>,控制观察点的使能。

ARCH32 GDB编译

armv7不支持单步位,需要GDB通过断点预测的方式模拟单步。编译GDB7.2时需要指定—target=arm-linux。指定其他目标可能导致GDB发送单步命令,而不是通过断点预测方式。

标签: #ubuntuarmlinuxgdb