嵌入式软件调试之软件断点

💡 原文中文,约5600字,阅读约需14分钟。
📝

内容提要

软件中断是一种用于调试的指令,在X86处理器中广泛使用。通过插入INT 3指令,可以在程序执行时设置软件断点。INT 3指令的机器码是0xCC,对应的汉字是“烫”。用户模式和内核模式下可以使用DebugBreak()和DbgBreakPoint()等API插入断点。软件断点有一些局限性,只适用于代码段,无法动态加载到ROM中执行的程序。

🎯

关键要点

  • 软件中断INT 3是一条用于调试的指令,广泛应用于X86处理器。
  • INT 3指令的机器码是0xCC,用户模式和内核模式下可以使用DebugBreak()和DbgBreakPoint()等API插入断点。
  • INT 3指令在程序执行时触发中断信号,使CPU进入调试模式。
  • 在Visual C++中,可以通过内联汇编插入INT 3指令设置断点。
  • INT 3属于陷阱异常,CPU在执行时会保存当前执行上下文。
  • 在实模式和保护模式下,INT 3指令的执行流程基本一致。
  • Windows多任务操作系统中,INT 3异常由内核函数KiTrap03处理,并通过调试子系统分发给调试器。
  • 调试器在收到调试事件后,会寻找匹配的断点记录以进行交互式调试。
  • Windows操作系统对x86 CPU的断点异常有特殊处理,将EIP的值减1,以确保程序指针指向正确位置。
  • 调试器通过调试API通知系统恢复被调试程序的执行。
  • INT 3指令的特殊用途包括填充缓冲区和内存对齐。
  • 用户模式下使用DebugBreak(),内核模式下使用DbgBreakPoint()或DbgBreakPointWithStatus()插入断点。
  • INT 3指令与INT n指令不同,具有独特的单字节机器码0xCC。
  • 软件断点的局限性包括仅适用于代码段,无法动态加载到ROM中执行的程序。
➡️

继续阅读