嵌入式软件调试之软件断点
💡
原文中文,约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中执行的程序。
➡️