Debug: freertos gdb plugin.
This commit is contained in:
120
debug/FreeRTOS/README.md
Normal file
120
debug/FreeRTOS/README.md
Normal file
@@ -0,0 +1,120 @@
|
||||
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:
|
||||
|
||||
1. 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.
|
||||
|
||||
2. 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.
|
||||
|
||||
3. 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
|
||||
|
||||
4. 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.
|
Reference in New Issue
Block a user