pyocd target.reset()导致STM32 GDB断点无法正常暂停的问题
PyOCD
target.reset()软复位后GDB断点失效的原因分析求助 环境信息
- 调试器:
GNU gdb (GNU Tools for STM32 13.3.rel1.20240926-1715) 14.2.90.20240526-git - PyOCD版本:
0.39.0 - 目标MCU:STM32H573MIYxQ
问题描述
正常调试流程中GDB断点可正常触发。部分场景下无法在MCU上电时启动GDB,此时通过物理复位引脚复位MCU,能够正常命中应用启动初期的断点。
但在无物理复位引脚的调试环境中,尝试使用PyOCD的target.reset()方法执行软复位后,出现断点失效问题:
- GDB初始显示程序处于暂停状态,但执行
next命令时提示PC register is not available - PyOCD输出错误日志:
ERROR:pyocd.coresight.cortex_m:cannot step: core not halted - 实际MCU已跳过断点,持续运行
已尝试的排查操作
- 替换为
target.reset_and_halt(); target.resume()的复位流程,问题未解决 - 分别使用
-O0和-Og编译项目,排除编译优化导致的断点异常,结果依旧
补充现象(更新)
- 测试发现
target.reset()后断点偶尔可正常工作,且与启动后到断点的延迟时间强相关:延迟10ms-85ms时断点必失效;延迟90ms起部分成功;延迟95ms及以上时断点全部正常触发。已排除应用中断、脚本操作等干扰因素。 - 目前找到临时替代方案:在GDB中执行
monitor reset halt后再执行cont命令,可正常命中断点,但该操作需在GDB交互环境中执行,无法嵌入PyOCD脚本,且不清楚target.reset()失效的根本原因。
现寻求对该现象的根本原因分析。
内容的提问来源于stack exchange,提问作者personal_cloud
相关产品推荐
相关产品推荐

