如何用Eclipse+OpenOCD+GDB连接运行中的MCU目标?
如何用OpenOCD + GDB连接运行中的MCU目标
我之前也碰到过一模一样的问题——默认配置一上来就烧录复位,取消后又找不到符号和源码,折腾了好一阵才摸清楚正确的操作姿势。下面是我整理的靠谱步骤:
第一步:启动OpenOCD,跳过烧录和复位
首先要让OpenOCD只建立调试连接,不执行任何烧录或复位操作,可以通过两种方式实现:
方式1:修改OpenOCD配置脚本
如果用的是自定义的.cfg脚本,找到里面类似program、reset这类自动执行的命令,把它们注释掉。比如:
# 注释掉自动烧录和复位的命令 # program your_firmware.elf reset exit # init; reset run
然后启动OpenOCD时加载这个脚本:
openocd -f your_config.cfg
方式2:命令行直接指定无操作启动
如果不想改脚本,直接用命令行启动OpenOCD,只初始化调试接口,不做后续操作:
openocd -f interface/your_debugger.cfg -f target/your_mcu.cfg -c "init; halt"
这里的halt是可选的:如果想连接时暂停运行中的MCU就加,只想保持它继续运行就换成resume或者直接去掉这个命令。
第二步:用GDB连接并手动加载符号/源码
取消自动烧录后,GDB不会自动加载ELF文件里的符号,所以得手动完成这些操作:
- 打开对应MCU的交叉编译GDB(比如ARM架构用
arm-none-eabi-gdb),先加载你的ELF文件:
file your_firmware.elf
这一步会把符号表加载进来,直接解决符号找不到的问题。
- 连接到OpenOCD的GDB服务器(默认端口是3333):
target remote localhost:3333
- 如果GDB找不到你的C/C++源码文件,手动设置源码搜索路径:
directory /path/to/your/source/code
比如你的源码都在./src目录下,就用directory ./src。
- 现在就可以正常调试了:如果之前没执行
halt,可以用halt命令暂停MCU,然后设置断点、查看变量、单步执行都没问题。
常见坑的解决方案
- 符号还是加载失败? 确保你的ELF文件是带调试信息编译的(编译时要加
-g参数,别用strip工具处理过)。 - 连接后MCU状态异常? 试试用
monitor reset halt让OpenOCD发送复位命令,但不会自动烧录——不过这会打断当前运行状态,如果你要保持运行中的现场就别用这个。 - GDB提示"Remote 'g' packet reply is too long"? 这通常是OpenOCD和GDB的架构不匹配,检查你用的GDB是不是对应MCU架构的交叉版本,比如ARM MCU要用
arm-none-eabi-gdb而不是系统默认的gdb。
内容的提问来源于stack exchange,提问作者Rolle
相关产品推荐
相关产品推荐

