执行monitor命令后如何刷新GDB寄存器?
GDB远程调试后寄存器未更新的解决办法
快速刷新寄存器的方法
不用重新连接目标,直接用以下命令强制GDB同步远程寄存器状态:
- 执行
refresh命令:这是GDB专门用来刷新目标状态的命令,会主动从远程调试端拉取最新的寄存器数据,覆盖本地缓存。执行后再查看$pc就能得到正确值。 - 执行
info registers命令:这个命令在显示寄存器信息前,会先同步远程的最新寄存器状态,同样能更新本地缓存。如果只想同步PC寄存器,也可以用info registers pc。
实际操作示例
按你的场景修改后的操作流程:
monitor reset halt refresh print $pc # 现在会正确显示Reset_Handler的地址
或者用info registers的版本:
monitor reset halt info registers pc print $pc # 此时$pc已更新为正确值
问题原因
GDB默认会缓存远程目标的寄存器数据来提升效率,而monitor命令是直接把指令发送给远程调试stub(比如OpenOCD)执行,不会自动触发GDB去同步本地缓存。所以执行完monitor reset halt后,本地的$pc还是之前的旧值,而monitor reg pc是直接让远程stub返回当前PC,所以显示正确。refresh或info registers则会主动触发同步,更新本地缓存。
内容的提问来源于stack exchange,提问作者jeb
相关产品推荐
相关产品推荐

