Linux下使用stlink-tools与GDB远程调试STM32的问题排查
STM32 stlink-tools调试断点失效与符号异常问题解决
问题根源分析
- 初始符号异常(
0x00000000 in ?? ()):STM32复位后执行启动代码阶段,若Flash地址映射未正确加载或看门狗未关闭,会导致CPU执行流程异常,无法关联调试符号。 - 断点无法触发+
list找不到memcpy-armv7m.S:GDB调试流程错误(依赖bin文件而非elf)、硬件断点资源不足、库源码未安装导致。
具体解决步骤
1. 修正GDB调试流程(弃用单独烧录bin的方式)
编译时已通过-g -O0生成带完整调试符号的blink01.elf,无需单独指定bin文件做远程执行文件,直接通过elf完成烧录与符号加载:
- 启动GDB:
gdb-multiarch blink01.elf - 连接st-util服务器:
target extended-remote localhost:4242 - 开启内存访问权限并加载程序:
set mem inaccessible-by-default off load
load命令会自动将elf文件烧录到STM32的正确地址,并完成符号映射,替代单独用st-flash烧录bin的步骤。
2. 修复断点无法触发问题
- 优先在自定义代码入口设置断点,避免在系统启动代码或库函数上设置:
break main,执行continue触发断点。 - 检查硬件断点数量:ARM Cortex-M系列硬件断点数量有限(通常2-4个),用
delete命令清除多余断点后重试。 - 升级stlink-tools到最新版本:
sudo apt update && sudo apt install --upgrade stlink-tools
3. 解决list找不到memcpy-armv7m.S的问题
- 安装gcc-arm-none-eabi的库源码包:
sudo apt install gcc-arm-none-eabi-source - 在GDB中设置源码路径映射(路径需根据实际安装位置调整,可通过
dpkg -L gcc-arm-none-eabi-source查看):set substitute-path /build/gcc-arm-none-eabi/src/gcc-arm-none-eabi /usr/src/gcc-arm-none-eabi
4. 看门狗关闭的正确姿势
确保在代码最早期关闭看门狗,避免调试过程中CPU被复位:
// 以STM32F1系列为例,关闭独立看门狗 void disable_iwdg(void) { RCC->APB1ENR |= RCC_APB1ENR_IWDGEN; IWDG->KR = 0xAAAA; // 喂狗防止立即复位 IWDG->KR = 0xCCCC; // 停止看门狗运行 } // 在main函数第一行调用 int main(void) { disable_iwdg(); // 后续代码... }
内容的提问来源于stack exchange,提问作者fghoussen
相关产品推荐
相关产品推荐

