* Debug: revert cortex debug to lxml * Debug: update PyCortexMDebug readme * fbt: moved "debug" dir to "scripts" subfolder * ufbt: added missing debug_other & debug_other_blackmagic targets; github: fixed script bundling * lint: fixed formatting on debug scripts * vscode: updated configuration for debug dir changes --------- Co-authored-by: hedger <hedger@users.noreply.github.com> Co-authored-by: hedger <hedger@nanode.su>
3.9 KiB
FreeRTOS-GDB
Python API Library for inspecting FreeRTOS Objects in GDB
Basically, the FreeRTOS internal state is kind of hard to inspect when working with GDB. This project provides some scripts for GDB's Python API that make accessing some of these internals a little easier to inspect.
##Requirements:
- You need to have the python API enabled in your version of GDB. This is a compile time option when building GDB. You should be able to do something like this:
gdb> python print "Hello World"
and get predictable results. If it throws an error - then you don't have python compiled in your version of GDB.
-
Need to be using FreeRTOS 8.0+. This code could probably be used with FreeRTOS version 7.0 or previous versions, but the current code doesn't support it.
-
You need to use the Handle Registry for Queue info to be any use. Note that this only works for Queue based objects and not for EventGroups
-
You need to put the FreeRTOS-GDB/src directory on your python path:
$> export PYTHONPATH=~/src/FreeRTOS-GDB/src/
How To Use:
$> gdb ./bin/program.elf
(gdb) c
Program runs on embedded device, sets up tasks, and queues
<Break>
(gdb) source ~/FreeRTOS-GDB/src/FreeRTOS.py
(gdb) show Task-List
Name PRI STCK
Ready List {0}: Num Tasks: 1
IDLE 0 107
Blocked List: Num Tasks: 11
EMAC Task 1 239
AFEC0 Task 1 295
LDSENS Task 1 195
AFEC1 Task 1 295
LineSample Task 1 281
DMAUART0 1 225
Log Task 1 273
BAT Task 1 169
Rx Task 1 421
Mng Task 2 551
Cell Task 1 275
Delayed {1}: Num Tasks: 5
Tmr Svc 3 355 62254
WLAN Task 1 205 13817
Init Task 1 445 10015
LED Task 1 179 7105
DMACOM1 1 265 7065
Delayed {2}: Num Tasks: 0
(gdb) show Queue-Info mutex
Num Queues: 6
NAME CNT SEND RECEIVE
LOG:LOCK 1 NONE NONE
STREAM:LOCK 1 NONE NONE
TWI:MUTEX 1 NONE NONE
CC3000:LOCK 1 NONE NONE
WLAN:LOCK 0 NONE NONE
SPI:LOCK 1 NONE NONE
(gdb) show Queue-Info queue
Num Queues: 14
NAME CNT SEND RECEIVE
TmrQ 0 Tmr Svc
LOG:MSGPOOL 12 NONE NONE
LOG:MSGQ 0 Log Task
TWI:QUEUE 0 NONE NONE
SPI:QUEUE 0 NONE NONE
DMAAFEC:POOL 1 NONE NONE
DMAAFEC:QUEUE 0 AFEC0 Task
DMAAFEC:POOL 1 NONE NONE
DMAAFEC:QUEUE 0 AFEC1 Task
COM:TXPOOL 3 NONE NONE
COM:TXQ 0 NONE NONE
COM:RXPOOL 5 NONE NONE
COM:RXQ 0 NONE NONE
FATFS:MUTEX 0 NONE NONE
@note - the NONE's above may just be empty strings.
This code adds the following custom GDB commands:
- show List-Handle (symbol|address) [CastType] CastType is an optional argument that will cast all of the handles in a list to a particular type.
- show Task-List
- show Handle-Registry
- show Handle-Name (symbole|address)
- show Queue-Info [filter] filter can be "queue","mutex","semaphore", "counting", "recursive"
@TODO
-
With GDB's Python API - it doesn't seem to handle code is separate files very well.
-
Currently, the EventGroup objects don't have an inspector. Work in progress - ideal solution would likely modify the struct of the Event Group to provide a similar piece of info that the Queue handle does so that we could use the same registry.