# gdbx **Repository Path**: zoomdy/gdbx ## Basic Information - **Project Name**: gdbx - **Description**: GDB 扩展。提供任务感知调试。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-27 - **Last Updated**: 2024-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #简介 GDBServer Extender(gdbx)顾名思义就是为GDB调试扩展一些本来没有的功能。例如线程(任务)感知调试(OS Aware)、线程(任务)堆栈检查等。 #下载 [详见wiki页](https://code.csdn.net/zoomdy/gdbx/wikis/%E4%B8%8B%E8%BD%BD) #文档 [详见wiki页](https://code.csdn.net/zoomdy/gdbx/wikis/%E6%96%87%E6%A1%A3) #特性 ##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 1. Cortex-M 2. i386 2. FreeRTOS 1. Cortex-M ##经过验证的仿真器/模拟器 1. J-Link 1. eCos / Cortex-M 2. OpenOCD 1. FreeRTOS / Cortex-M 3. QEMU 1. eCos / i386 ##Eclipse+GDB调试FreeRTOS示例 ![Eclipse+GDB调试FreeRTOS示例](https://csdn-code.oss.aliyuncs.com/php-upload-images/20160212-1040-4606-9938/eclipse-debug-freertos-task-list.png "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 , 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 , 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 , pvParameters=0x60) at FreeRTOS/portable/GCC/ARM_CM3/port.c:227 Backtrace stopped: previous frame inner to this frame (corrupt stack?) (gdb) ``` #更多内容 [更多内容请访问wiki页](https://code.csdn.net/zoomdy/gdbx/wikis)