[开源项目] 软件调试器【恢复】
在GNU GDB调试软件中存在一种方式:PC Host主机上运行gdb主程序(一个命令行的调试工具),在Target目标板上运行一个庄(gdb stub),让这个庄与gdb主程序通信,从而实现在PC Host主机对目标板上运行的软件进行调试(汇编级调试及C/C++源代码级调试)。在linux kernel 2.6.x官方发布中已包含了完整的gdb stub服务,而netbsd中也配置了全套的gdb stub服务。详细的linux kernel kgdb资料可参见:
http://www.ibm.com/developerworks/cn/linux/l-kdb/
http://www.ibm.com/developerworks/cn/linux/l-kdbug/index.html
原始的linux kernel gdb stub见:http://kgdb.linsyssoft.com
那我们这个开源项目要做的是什么呢?就是在一些RTOS上采用gdb stub类似的技术也实现一种软件调试方法,进行RTOS的源码级调试。
技术上,和原有的kgdb的差别主要在于通信方式上。因为目前USB已经很普及了,很多SoC都能够支持USB device,所以通信采用USB的模式(原有的kgdb采用的串口或以太网的方式)。采用USB通信的好处是,从目标板上获取数据或调试交互速度加快,在下载文件或获取板子上的memory内容上区别将非常明显。
平台:arm(ARM7或ARM9),完成后也可以考虑其他平台,例如avr32
操作系统:ucos或RT-Thread。希望能够做到操作系统无关,甚至是可以用来调试操作系统。
调试器:gdb,目前已经存在一些使用gdb做为调试后端的GUI工具,可以直接使用。linux上的ddd,insight,及windows上的insight,eclipse,codeblocks
因为这个项目是纯软件上的,所有的代码都会开源。
这个帖子会根据进度不定时更新,欢迎参与! gdb stub 不能让cpu停住,只是让cpu在死转 这是什么原理呀?怎么让cpu停住呀 楼主想法不错,不过这只能针对具体某个操作系统或者是bootloader,不知道楼主准备在哪个系统上做
to 【4楼】 dack
redboot和ecos用code::blocks+gdb调试,是直接用code::blocks编译,然后调试吗 现在发现支持调试的工具真多,例如OpenOCD + USB2JTAG的东西,就可以直接调试软件了,也便宜~~ 嚯嚯,原来redboot已经支持了啊,还不知道。
不过应该也没关系,自己再实现一套也不难。至于为什么用usb,因为usb的虚拟串口应该会比真实串口快。PC上的软件基本上不会写的,关键是gdb stub和usb serial。 GDB RSP(Remote Serial Protocol)定义了GDB宿主机与被调试目标机进行通信时数据包的格式。信息的格式是:$数据#校验码。多数信息使用ASCII码,数据由一系列的 ASCII码组成,校验码是由两个16进制数组成的单字节校验码。接收方接收数据并校验,若正确则回应“+”,否则回应“-”。通信的内容包括读写数据、控制程序运行、报告程序状态等命令。RSP的基本命令从通信对话角度可以分为两种:
(1)请求
?:读当前系统状态
g:读所有寄存器
G<regiater_data>:写所有寄存器
m<address>,<length>:读内存
M<address>,<length>:<memory_data>:写内存
c:继续执行
s:单步执行
k:终止进程
(2)答复
“”:告诉GDB上次请求命令不支持。
E:告诉GDB出错
OK:上次请求正确
w<exit_Status>:系统在“exit_status”状态下退出。
X<signal>:系统在signal信号下终止。
S<signal>:系统在signal信号下停止。
O:告诉GDB控制台输出。这也是惟一向GDB发出的命令。
完整的RSP协议描述:
http://sourceware.org/gdb/current/onlinedocs/gdb_34.html#SEC708
本贴被 queue 编辑过,最后修改时间:2008-11-23,09:41:05. 而且你用usb串口似乎完全没必要写软件,直接连上就可以工作了。一般开发板上串口都是必备的吧。usb slave倒是不是都有 不太理解楼主这么做和现有的相比有什么优点。
我现在开发板装redboot(自带gdb stub),通过网络连接,前端用code::blocks+gdb进行调试,可以调试裸机代码,调试操作系统当然也没问题。速度我想不比usb慢,而且你还要用usb串口,速度一般不会比真串口快。 软件代码结构:
gdb stub -- 这部分代码主要用于解析gdb发送过来的命令,并执行相应的动作;
usb stack -- 这部分代码是一件简单的usb stack,包含EP控制代码,以及serial(串口)的代码
gdb stub与usb stack之间采用简单的接口进行通信,基本上依然采用原来的串口接口方式进行通信(反正USB那边也是一个虚拟串口)。
为了能够调试中断程序,usb串口代码采用非中断模式进行数据收发。 支持一下
页:
[1]