Skip to content

Instantly share code, notes, and snippets.

@johnMamish
Created September 12, 2023 15:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save johnMamish/45554256476917613a79507b973643ff to your computer and use it in GitHub Desktop.
Save johnMamish/45554256476917613a79507b973643ff to your computer and use it in GitHub Desktop.
GDB script to backtrace from any FreeRTOS thread when you break in GDB
# example usage in gdb
# (gdb) source freertos_backtrace.gdb
# (gdb) freertos_bt my_task_control_block
#
# My code uses statically allocated TCBs, so the name of the TCB to use should be defined
# by you in your source code that initializes all the threads.
#
# Note that this may fail if you - by chance - happen to break inside of the SVHandler when
# it's switching to or from the task you want to inspect
define freertos_bt
# backup all registers
set $_r0_backup = $r0
set $_r1_backup = $r1
set $_r2_backup = $r2
set $_r3_backup = $r3
set $_r4_backup = $r4
set $_r5_backup = $r5
set $_r6_backup = $r6
set $_r7_backup = $r7
set $_r8_backup = $r8
set $_r9_backup = $r9
set $_r10_backup = $r10
set $_r11_backup = $r11
set $_sp_backup = $sp
set $_lr_backup = $lr
set $_pc_backup = $pc
# unwind stack into registers
set $r4 = *((uint32_t*)$arg0->pxDummy1 + 0)
set $r5 = *((uint32_t*)$arg0->pxDummy1 + 1)
set $r6 = *((uint32_t*)$arg0->pxDummy1 + 2)
set $r7 = *((uint32_t*)$arg0->pxDummy1 + 3)
set $r8 = *((uint32_t*)$arg0->pxDummy1 + 4)
set $r9 = *((uint32_t*)$arg0->pxDummy1 + 5)
set $r10 = *((uint32_t*)$arg0->pxDummy1 + 6)
set $r11 = *((uint32_t*)$arg0->pxDummy1 + 7)
set $r0 = *((uint32_t*)$arg0->pxDummy1 + 9)
set $r1 = *((uint32_t*)$arg0->pxDummy1 + 10)
set $r2 = *((uint32_t*)$arg0->pxDummy1 + 11)
set $r3 = *((uint32_t*)$arg0->pxDummy1 + 12)
set $r12 = *((uint32_t*)$arg0->pxDummy1 + 13)
set $sp = ((uint32_t*)$arg0->pxDummy1 + 17)
set $lr = *((uint32_t*)$arg0->pxDummy1 + 14)
set $pc = *((uint32_t*)$arg0->pxDummy1 + 15)
# perform backtrace
bt
# restore registers
set $r0 = $_r0_backup
set $r1 = $_r1_backup
set $r2 = $_r2_backup
set $r3 = $_r3_backup
set $r4 = $_r4_backup
set $r5 = $_r5_backup
set $r6 = $_r6_backup
set $r7 = $_r7_backup
set $r8 = $_r8_backup
set $r9 = $_r9_backup
set $r10 = $_r10_backup
set $r11 = $_r11_backup
set $sp = $_sp_backup
set $lr = $_lr_backup
set $pc = $_pc_backup
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment