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)调试使用说明

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.