openocd启动失败主因是未加入path:终端执行openocd -v报command not found即证实;需将openocd所在bin目录(如d:\tools\openocd\bin)添加至系统path,并重启vs code生效。

OpenOCD 启动失败:检查 openocd 是否在 PATH 里
VS Code 启动调试时,cortex-debug 插件会尝试调用 openocd 命令。如果系统找不到这个命令,就会报错 “command ‘openocd’ not found” 或直接卡在 “Launching OpenOCD…”。这不是插件问题,而是环境没配好。
验证方式很简单:打开终端(Windows PowerShell / macOS Terminal / WSL bash),执行:
openocd -v
如果提示 command not found,说明 openocd 的 bin/ 目录没进系统 PATH。常见路径示例:
- Windows:
D:\Tools\openocd\bin - macOS:
/usr/local/bin(Homebrew 安装)或/opt/homebrew/bin(Apple Silicon) - Ubuntu:
/usr/bin(apt 安装)或自编译路径如/usr/local/bin
改完 PATH 后,**必须重启 VS Code**——它不会动态读取新环境变量。
ST-Link / J-Link 连不上:驱动和 connect-under-reset 是关键
现象包括:Error: init mode failed、Failed to enter SWD mode、Target not examined yet。本质是 OpenOCD 拿不到芯片的控制权。
两个最常被忽略的点:
- Windows 下 J-Link 需要“换驱动”:卸载设备管理器中 J-Link 的默认驱动(Segger),改用 libusb 驱动(可用 Zadig 工具一键替换为 WinUSB 或 libusb-win32)
- ST-Link 常见于 STM32 板子,但很多新版芯片(尤其 F4/F7/H7)需要加
connectUnderReset:true才能握手成功,否则报 Error 138
对应 launch.json 片段:
微软正式发布 Visual Studio Code 1.118 版本 。本次更新重点强化了 AI 开发体验与企业管理能力,其中最引人注目的是新增 Copilot CLI 远程控制功能,允许开发者通过手机或网页远程监控和接管 AI 会话 。同时,为了提高 AI 的运行性价比,新版本优化了令牌缓存策略以降低成本 。此外,1.118 版还引入了 Chronicle 本地历史追踪、TypeScript 7.0 支持以及更严格的企业级访问管控 。
"configFiles": ["interface/stlink.cfg", "target/stm32f4x.cfg"], "connectUnderReset": true,
注意:connectUnderReset 是 cortex-debug 插件的参数,不是 OpenOCD 的 -c 命令,别写错位置。
GDB 端口冲突:别手动开 OpenOCD,让 cortex-debug 全权托管
新手常犯操作:先在终端手动运行 openocd -f stlink.cfg -f stm32f4x.cfg,再点 VS Code 的 ▶️ 调试。结果是端口 3333 被占,VS Code 报 Cannot connect to GDB server 或 Connection refused。
cortex-debug 默认会自己拉起 OpenOCD 并监听 localhost:3333,你手动启动等于抢了它的活儿。正确做法是:
- 确保终端里没有残留的
openocd进程(Linux/macOS 用ps aux | grep openocd+kill;Windows 用任务管理器) - 删掉
launch.json中所有类似"serverpath"或"miDebuggerServerAddress"的手动指定字段(除非你真要换端口) - 把调试配置里的
"request"设为"launch",而不是"attach"
例外情况:仅当你用 PyOCD 或 J-Link GDB Server 替代 OpenOCD 时,才需显式指定 serverpath 和端口。
WSL 调试 STM32:GDB 架构不匹配与 SDRAM 初始化陷阱
在 WSL(尤其是 Ubuntu)里调试裸机代码,容易遇到两个硬伤:
-
gdb缺失或架构不对:WSL 默认的gdb是 x86_64 调试器,不能调试 ARM ELF。必须装gdb-multiarch,并在launch.json显式指定:
"miDebuggerPath": "/usr/bin/gdb-multiarch"
- SDRAM 未初始化就
load:比如 Mini2440 这类老平台,代码烧到0x30000000,但上电后 SDRAM 控制器是关闭的。GDBload命令会静默失败(内存读出来全是 0xFF),程序跑飞。必须在setupCommands里用monitor mww写寄存器初始化控制器,且顺序必须在load之前
这步没法跳过,也很难靠错误信息反推——现象就是断点不命中、main 不停、变量全乱码。查板级手册找 SDRAM 寄存器地址和值,才是唯一解法。










