使用VSCode GDB调试STM32时复位处理程序出现异常
STM32 VSCode GDB调试向量表重定位问题解决方案
- 必须告知GDB向量表重定位地址,STM32CubeIDE是自动完成该配置的,VSCode中需要手动设置:
- 在GDB启动时执行命令设置VTOR寄存器:
set $VTOR = 0x8008200。VTOR是STM32控制向量表基地址的寄存器,硬件默认指向0x08000000,重定位后不手动设置的话,异常触发时会读取错误的向量地址,直接导致崩溃。
- 在GDB启动时执行命令设置VTOR寄存器:
- 配置VSCode的
launch.json实现自动设置:- 可以在
miDebuggerArgs里添加该命令,示例:"miDebuggerArgs": "-ex \"set $VTOR = 0x8008200\"" - 或者创建GDB初始化脚本(比如
gdb_init.gdb),写入set $VTOR = 0x8008200,然后在launch.json里通过miDebuggerPath后的-x gdb_init.gdb加载脚本。
- 可以在
- 检查固件的Reset_Handler代码:
- 如果你的固件在启动时没有自行设置VTOR寄存器(比如在Reset_Handler开头添加
LDR R0, =0xE000ED08、LDR R1, =0x8008200、STR R1, [R0]这类指令),那么调试时必须由GDB提前设置,否则硬件还是会使用默认向量表地址。
- 如果你的固件在启动时没有自行设置VTOR寄存器(比如在Reset_Handler开头添加
- 确认PC的Thumb模式正确性:
- Thumb指令模式下PC的最低位必须为1,所以启动时PC应设置为0x8012031而非0x8012030。如果调试配置里错误设置了不带最低位的PC地址,会导致CPU进入ARM模式执行Thumb指令,直接触发崩溃。可以在GDB里用
info registers pc检查当前PC值是否正确。
- Thumb指令模式下PC的最低位必须为1,所以启动时PC应设置为0x8012031而非0x8012030。如果调试配置里错误设置了不带最低位的PC地址,会导致CPU进入ARM模式执行Thumb指令,直接触发崩溃。可以在GDB里用
- 验证链接脚本的向量表定义:
- 确保链接脚本里
__vector_table或__Vectors的起始地址被正确设置为0x8008200,通过GDB命令print &__vector_table可以查看该符号的地址是否符合预期,避免链接时向量表地址未正确重定位。
- 确保链接脚本里
内容的提问来源于stack exchange,提问作者zetanaught
相关产品推荐
相关产品推荐

