Menu

Tree [9ebdea] master /
 History

HTTPS access


File Date Author Commit
 src 2016-02-12 zoomdy zoomdy [f1b668] 1.vFlashWrite传输的也是二进制数据包。
 tools 2016-01-05 zoomdy zoomdy [9006a5] 通过选项控制串口工具的调试输出。
 .classpath 2015-06-12 zoomdy zoomdy [9d0d38] 重命名包名为org.zoomdy.gdbx;BaseNode重命名为Node。
 .gitignore 2015-12-19 zoomdy zoomdy [6c9a32] 添加OSNode,实时操作系统线程信息获取节点。
 .project 2015-06-12 zoomdy zoomdy [9d0d38] 重命名包名为org.zoomdy.gdbx;BaseNode重命名为Node。
 README.md 2016-02-12 zoomdy zoomdy [9ebdea] 添加调试FreeRTOS的示例。

Read Me

简介

GDBServer Extender(gdbx)顾名思义就是为GDB调试扩展一些本来没有的功能。例如线程(任务)感知调试(OS Aware)、线程(任务)堆栈检查等。

特性

OS Aware调试

GDBServer Extender(gdbx)为GDB添加OS Aware调试特性。所谓OS Aware调试就是调试时可以通过GDB的info threads命令获取被调试系统的线程(任务)信息。在桌面系统中,通过info threads获取线程信息是调试多线程程序的基本功能,桌面系统的GDB默认支持 OS Aware(Thread Aware?)。在嵌入式系统中,GDB需要与GDB Server(GDB Stubs)相配合才能进行调试,线程信息是由GDB Server提供给GDB的。GDB Server通常是仿真器的配套软件,例如J-Link的配套软件就包括了J-Link GDB Server这个程序。仿真器的GDB Server往往不提供OS Aware特性,也就是说不能提供线程信息。GDBServer Extender(gdbx)的首要任务便是为不支持OS Aware的GDB Server扩展OS Aware功能。

使用GDB和目标程序解析符号

在组织线程信息时,不仅要知道关键数据结构的地址,还需要知道结构体成员的偏移地址。其它支持OS Aware的GDB Server(如OpenOCD)是使用GDB远程串行协议(GDB与GDB Server的通信协议)的qSymbol包来解析符号地址的。使用qSymbol只能解析符号地址,不能完成数据结构的解析等复杂操作。嵌入式操作系统(如eCos、FreeRTOS等)通常是可配置的,不同的配置会有不同的结构体成员,这将影响结构体成员的偏移地址。OpenOCD的OS Aware假设目标系统是默认配置的,使用常量作为结构体成员的偏移地址,如果目标系统不是按默认配置的,那一切都乱了。gdbx则调用GDB来解析相关的地址和数据结构,当目标程序包含调试信息时(编译时加入-g参数),GDB可以精确地获取符号地址以及结构体成员的偏移地址,无论目标系统是如何配置的,都可以正确地读取数据结构,然后转换成线程信息列表。

Java实现

得益于Java“一次编译,到处运行”的跨平台特性,GDBServer Extender(gdbx)可以在Windows、Linux、Mac OS X等各种宿主机平台上运行。将来还可以集成到Eclipse集成开发环境中,Eclipse是Java实现的呀。

线程感知调试

支持的RTOS和Arch

  1. eCos
  2. Cortex-M
  3. i386
  4. FreeRTOS
  5. Cortex-M

经过验证的仿真器/模拟器

  1. J-Link
  2. eCos / Cortex-M
  3. OpenOCD
  4. FreeRTOS / Cortex-M
  5. QEMU
  6. eCos / i386

Eclipse+GDB调试FreeRTOS示例

Eclipse+GDB调试FreeRTOS示例

GDB调试FreeRTOS示例

(gdb) info threads
[New Thread 536875040]
[New Thread 536879144]
  Id   Target Id         Frame 
  3    Thread 536879144 (state:Blocked;prio:1;name:"Periodic") vPortYield () at FreeRTOS/portable/GCC/ARM_CM3/port.c:376
  2    Thread 536875040 (state:Blocked;prio:3;name:"Handler") vPortYield () at FreeRTOS/portable/GCC/ARM_CM3/port.c:376
* 1    Thread 536879760 (state:Running;prio:0;name:"IDLE") prvIdleTask (pvParameters=0x0) at FreeRTOS/tasks.c:2757
(gdb) bt
#0  prvIdleTask (pvParameters=0x0) at FreeRTOS/tasks.c:2757
#1  0x08000558 in pxPortInitialiseStack (pxTopOfStack=0x9da5a5a5, pxCode=0xa5e000ed, pvParameters=0x4100000)
    at FreeRTOS/portable/GCC/ARM_CM3/port.c:227
#2  0x08000558 in pxPortInitialiseStack (pxTopOfStack=0xffffffff, pxCode=0xffffffff, pvParameters=0xffffffff)
    at FreeRTOS/portable/GCC/ARM_CM3/port.c:227
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) thread 2
[Switching to thread 2 (Thread 536875040)]
#0  vPortYield () at FreeRTOS/portable/GCC/ARM_CM3/port.c:376
376 }
(gdb) bt
#0  vPortYield () at FreeRTOS/portable/GCC/ARM_CM3/port.c:376
#1  0x08000e9c in xQueueGenericReceive (xQueue=0x20000020 <ucHeap+16>, pvBuffer=0x0, xTicksToWait=4294967295, xJustPeeking=0)
    at FreeRTOS/queue.c:1530
#2  0x08001f36 in vHandlerTask (pvParameters=0x0) at ../main.c:53
#3  0x08000558 in pxPortInitialiseStack (pxTopOfStack=0x7c200010, pxCode=0x20200065, pvParameters=0x84200065)
    at FreeRTOS/portable/GCC/ARM_CM3/port.c:227
#4  0x08000558 in pxPortInitialiseStack (pxTopOfStack=0x8000559 <prvTaskExitError>, pxCode=0xa5a5a5a5, pvParameters=0x30003)
    at FreeRTOS/portable/GCC/ARM_CM3/port.c:227
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) thread 3
[Switching to thread 3 (Thread 536879144)]
#0  vPortYield () at FreeRTOS/portable/GCC/ARM_CM3/port.c:376
376 }
(gdb) bt
#0  vPortYield () at FreeRTOS/portable/GCC/ARM_CM3/port.c:376
#1  0x080012aa in vTaskDelay (xTicksToDelay=500) at FreeRTOS/tasks.c:975
#2  0x08001ef8 in vPeriodicTask (pvParameters=0x0) at ../main.c:32
#3  0x08000558 in pxPortInitialiseStack (pxTopOfStack=0x28200065, pxCode=0x28000036, pvParameters=0xb020001f)
    at FreeRTOS/portable/GCC/ARM_CM3/port.c:227
#4  0x08000558 in pxPortInitialiseStack (pxTopOfStack=0x36b0, pxCode=0x20001fa8 <ucHeap+8088>, pvParameters=0x60)
    at FreeRTOS/portable/GCC/ARM_CM3/port.c:227
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) 

文档

GDBX线程感知(OS Aware)调试使用说明