Created
September 12, 2023 15:03
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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