You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下使用stlink-tools与GDB远程调试STM32的问题排查

问题根源分析

  • 初始符号异常(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:23:25