gdbx通过org.zoomdy.gdbx.OSNode组件提供线程感知调试(OS Aware Debugging)功能。这里介绍org.zoomdy.gdbx.OSNode(后续简称gdbx.OSNode)的使用。
关于gdbx(GDBServer Extender)的更多内容请访问gdbx项目主页
http://blog.csdn.net/zoomdy/article/details/50651465
mingdu.zheng at gmail dot com
安装JRE
gdbx.OSNode是使用Java实现的,所以首先需要安装JRE,要求JRE7或以上。如何安装JRE请找度娘。
下载gdbx.OSNode
点击这里打开下载页面,选择最新版本的gdbx.OSNode下载。
运行gdbx.OSNode
这里以gdbx.OSNode-1.2.0版本为例,GDB Server为OpenOCD,目标机为STM32F4-Discovery,目标机运行FreeRTOS。首先运行openocd
openocd -f board/stm32f4discovery.cfg
接着运行gdbx.OSNode
java -jar ~/gdbx/org.zoomdy.gdbx.OSNode-1.2.0.jar --server-port=9000 --client-port=3333 --openocd --gdb=arm-none-eabi-gdb --exec=Debug/Example12.elf
运行GDB,已省略无关紧要的输出
arm-none-eabi-gdb Debug/Example12.elf
(gdb) target remote :9000
(gdb) load
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
(gdb) info threads
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") 0x08001a02 in prvCheckTasksWaitingTermination () at FreeRTOS/tasks.c:3002
(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=0x2800000d, pvParameters=0xac20001f)
at FreeRTOS/portable/GCC/ARM_CM3/port.c:227
#4 0x08000558 in pxPortInitialiseStack (pxTopOfStack=0xdac, pxCode=0x20001fa8 <ucHeap+8088>, pvParameters=0x60)
at FreeRTOS/portable/GCC/ARM_CM3/port.c:227
参数详解
--client-port=nnnn
指定GDB Server的连接端口,OpenOCD的默认连接端口为3333,J-Link的默认连接端口为2331,QEMU的默认连接端口为1234。
--server-port=nnnn
指定GDB的连接端口,如未指定,那么使用默认端口9001。
--gdb=filename
指定使用的GDB调试器,如果GDB不在PATH搜索路径中,那么需要完整路径。gdbx.OSNode需要GDB来解析目标程序符号和数据结构,应该与调试目标程序的GDB一致。
--exec=target-executable-file
指定被调试的目标机程序,必须包含调试信息(即使用-g参数进行编译链接)。gdbx.OSNode使用该文件解析目标程序符号和数据结构,应该与被调试目标程序一致。
--openocd
理论上讲,gdbx.OSNode是独立于仿真器或模拟器,但与某些仿真器或模拟器存在兼容性问题,当与OpenOCD的配合有问题时,尝试加入该参数解决问题。
--jlink
理论上讲,gdbx.OSNode是独立于仿真器或模拟器,但与某些仿真器或模拟器存在兼容性问题,当与J-Link的配合有问题时,尝试加入该参数解决问题。
--qemu
理论上讲,gdbx.OSNode是独立于仿真器或模拟器,但与某些仿真器或模拟器存在兼容性问题,当与QEMU的配合有问题时,尝试加入该参数解决问题。