为仿真器添加eCos多线程调试支持,GDBServer Extender 0.0.1 使用说明

来源:互联网 发布:cf网络异常的解决办法 编辑:程序博客网 时间:2024/06/03 21:58

可以使用RedBoot或者仿真器调试eCos系统,RedBoot集成的GDBStubs已经支持eCos的多线程调试,使用GDB命令info threads就可以读取当前的线程状态。但是使用仿真器时,由于仿真器不是专门针对eCos设计,因此通常不提供eCos系统多线程调试支持。为了在使用仿真器的情况下也能获得eCos系统多线程调试支持,zoomdy编写了GDBServer Extender工具来扩展仿真器GDBServer功能使其支持eCos多线程调试。GDBServer Extender 0.0.1是一个早期原型版本,虽然距离最终的成为Eclipse插件或基于Eclipse RCP的独立工具的目标还有相当长的路要走,但是它已经可以工作啦!

mingdu.zheng <at> gmail <dot> com
http://blog.csdn.net/zoomdy/article/details/17589607

基本原理

使用仿真器调试时,仿真器软件将开启一个GDB Server服务,例如J-Link提供并开启J-Link GDB Server,GDB通过Socket连接到该GDB Server服务程序并交换数据,GDB Server将GDB的请求转换为仿真器的控制指令传递给仿真器。典型的连接示意图如下。

GDBServer Extender的工作原理是在GDB和GDBServer之间插入另外的节点,GDB连接到GDBServer Extender,GDBServer Extender连接仿真器的GDBServer,所有的GDB请求都首先经过GDBServer Extender 然后再发给GDBServer,因此GDBServer Extender可以知道GDB发送了什么请求,并将GDBServer不支持的GDB请求转换成GDBServer支持的请求再发送给GDBServer。同样的,所有GDBServer的响应都首先经过GDBServer Extender然后再返回到GDB,GDBServer Extender可以对GDBServer返回的数据进行再加工后返回给GDB。插入GDBServer Extender后的连接示意图如下。

有了截获并再加工GDB命令和响应的手段后,就可以将GDB读取线程信息的指令转换为读取相关存储器的指令发送给GDBServer,并将返回的数据结果解析为线程信息返回给GDB,这就解决了仿真器GDBServer不支持多线程调试的问题。对于非线程信息获取相关的GDB指令,GDBServer Extender不做任何处理原样转发给仿真器GDBServer。

下载

GDBServer Extender使用Java编写,因此首先要安装JRE,如果是使用Eclipse+GDB调试的,那基本上已经安装过JRE了,因为Eclipse也是Java编写的。

JRE的下载页面http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html,下载JRE即可。

然后到GDBServer Extender项目主页下载页面下载gdbserver-extender-0.0.1.jar,http://sourceforge.net/projects/gdbserver-extender/files/。

使用方法

首先要打开仿真器的GDBServer并与目标机建立正确的连接,并要求GDBServer的监听端口为2331(J-Link的默认端口,如果不是J-Link,那么修改GDBServer配置将监听端口更改为2331),GDBServer Extender 0.0.1作为原型版本,所有的参数都使用了硬编码而不能配置,以后的版本将会添加自定义连接端口。

如果是Windows打开命令提示符,不要使用Cygwin的shell;如果是Linux,打开任意的终端。在命令提示符输入

java -jar <存储路径>/gdbserver-extender-0.0.1.jar

开启GDBServer Extender,如果成功,那么将看到“服务已开启,监听端口:10000,等待连接。”等信息。

使用GDB

依照往常打开GDB并连接远程目标,远程目标设定为localhost:1000,GDBServer Extender 0.0.1作为原型版本,所有的参数都使用了硬编码而不能配置,以后的版本将会添加自定义连接端口。

(gdb)target remote localhost:10000

正确设定连接后,按照往常的调试方法进行调试,当目标机停下来时,可以在GDB输入

(gdb)info theads

查看线程列表。

(gdb)thread <id>

选择指定的线程作为当前操作线程<id>为线程编号,即info threads输出最前面的数字。

(gdb)bt

查看选中线程的调用栈。

使用Eclipse+GDB

如果使用Eclipse,使用默认的连接端口(Port number)10000,将调试配置Debugger页的Force thread list update on suspend勾上就会自动拉取线程。

Eclipse重要补充

为了读取线程相关数据,GDBServer Extender要求GDB发送qSymbol请求以解析所需的符号,在单独使用GDB的情况下,这是没有问题的,在连接GDBServer后,GDB将发送qSymbol请求,而使用Eclipse+GDB时却不会发送qSymbol请求,解决办法时添加sym指令手动加载应用程序符号,在调试配置的Startup页的Intialization Commands输入框内填入-interpreter-exec console "sym 文件名",如果在Windows下使用官方的GDB,那么文件名必须是Cygwin路径,然后把Load symbols选项取消。见下图。


开始调试后Eclipse的Debug视图就列出当前所有线程及调用栈,需要注意的是标有<main>的线程是指CPU当前正在执行的线程,总是与后面的某一条线程记录重复,也就是看到的线程比实际运行的线程数目要多一条,其中当前线程被重复了两次。

如果所使用的Eclipse版本不能暂停执行过程,也就是说Eclipse的Run >> Suspend不可用,那么可以在运行GDBServer Extender的命令提示符窗口输入Ctrl+C字符串然后回车来暂停执行过程。

使用限制

0.0.1版本是硬编码的,包括对线程数据结构的读取,因此只有在使用默认的kernel配置的情况下读取的线程数据才保证是完全正确的,如果修改了kernel配置引起Cyg_Thread类的结构发生改变,那么返回的数据可能是错误的。在以后的版本中将尝试加入自动检测kernel配置情况来消除这种限制。

0 0
原创粉丝点击