Simics 2021.24版本step-out与step-over-instruction功能是否存在故障?
Simics 2021.24 调试命令异常处理方案
故障表现
step-out命令执行无效果,执行后指令指针(RIP)未跳转到当前函数的返回地址位置,仍停留在原函数内部step-over-instruction命令无法跨过call调用,执行后直接进入call指令指向的目标函数内部,未停留在call的下一条指令位置
根因说明
Simics 2021.24版本存在x86架构下调试器指令识别与栈帧解析的已知缺陷,该缺陷会导致调试器无法正确识别call、ret指令的关联栈上下文,进而导致依赖上下文判断的步进类命令失效,即使提前执行enable-debugger开启调试器也无法规避该问题。
解决方案
官方修复方案
直接升级至Simics 2022.16及以上版本,该版本官方已完整修复上述调试命令缺陷,可正常使用step-out、step-over-instruction功能。
临时兼容方案
若无法升级版本,可通过手动操作替代失效命令:
- 替代
step-over-instruction:- 停在call指令位置时,执行
disassemble %rip 1确认当前call指令的长度,x86下间接call指令通常为2字节 - 对call指令的下一条地址设置临时断点后执行运行命令,示例:
bp -t (%rip + 2); c
- 停在call指令位置时,执行
- 替代
step-out:
读取当前栈顶存储的返回地址,设置临时断点后运行,示例:bp -t *(%rsp); c
验证规则
操作完成后可通过如下方式验证效果:
- 执行
step-over-instruction替代方案后,检查RIP值是否等于call指令的下一条地址 - 执行
step-out替代方案后,检查RIP值是否等于当前栈顶存储的返回地址值
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

