queue 发表于 2008-11-23 08:32:54

[开源项目] 软件调试器【恢复】

在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



因为这个项目是纯软件上的,所有的代码都会开源。



这个帖子会根据进度不定时更新,欢迎参与!

gaiwang0142 发表于 2009-1-15 12:37:22

gdb stub 不能让cpu停住,只是让cpu在死转

wswh2o 发表于 2009-1-14 15:06:50

这是什么原理呀?怎么让cpu停住呀

gaiwang0142 发表于 2009-1-14 13:49:08

楼主想法不错,不过这只能针对具体某个操作系统或者是bootloader,不知道楼主准备在哪个系统上做



to 【4楼】 dack 

redboot和ecos用code::blocks+gdb调试,是直接用code::blocks编译,然后调试吗

queue 发表于 2008-11-29 22:49:56

现在发现支持调试的工具真多,例如OpenOCD + USB2JTAG的东西,就可以直接调试软件了,也便宜~~

queue 发表于 2008-11-25 15:49:19

嚯嚯,原来redboot已经支持了啊,还不知道。



不过应该也没关系,自己再实现一套也不难。至于为什么用usb,因为usb的虚拟串口应该会比真实串口快。PC上的软件基本上不会写的,关键是gdb stub和usb serial。

queue 发表于 2008-11-23 09:38:17

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.

dack 发表于 2008-11-23 09:57:12

而且你用usb串口似乎完全没必要写软件,直接连上就可以工作了。一般开发板上串口都是必备的吧。usb slave倒是不是都有

dack 发表于 2008-11-23 09:45:59

不太理解楼主这么做和现有的相比有什么优点。

我现在开发板装redboot(自带gdb stub),通过网络连接,前端用code::blocks+gdb进行调试,可以调试裸机代码,调试操作系统当然也没问题。速度我想不比usb慢,而且你还要用usb串口,速度一般不会比真串口快。

armok 发表于 2008-11-23 09:32:16

queue 发表于 2008-11-23 08:37:39

软件代码结构:

gdb stub -- 这部分代码主要用于解析gdb发送过来的命令,并执行相应的动作;

usb stack -- 这部分代码是一件简单的usb stack,包含EP控制代码,以及serial(串口)的代码



gdb stub与usb stack之间采用简单的接口进行通信,基本上依然采用原来的串口接口方式进行通信(反正USB那边也是一个虚拟串口)。



为了能够调试中断程序,usb串口代码采用非中断模式进行数据收发。

liurangzhou 发表于 2010-7-31 14:48:02

支持一下
页: [1]
查看完整版本: [开源项目] 软件调试器【恢复】