断点&&单步执行

it2022-05-05  178

软件断点

INT3指令 – 0xCC【n为3的INT指令,一般的INT指令会是0xCDn,但是INT3被优待啦_】 在调试器中对某一行设置断点时,调试器会先把这里的本来指令的第一个字节保存起来,然后写入一条INT3指令【因为INT3的长度为1个字节,所以在设置和取消断点的时候,也只需要保存和恢复一个字节】。这种替换是在启动调试时和调试过程中动态进行的。

程序运行到断点时,程序指针指向的仍是INT3指令的位置,而不是它的下一条指令。为什么? 1. 调试器在落实断点的时候,不管所在位置的指令是几个字节,它都只替换一个字节。【因此,如果程序指针指向下一个指令位置,那么指向的可能是原来的多字节指令的第二个字节,不是一条完整的指令】 2. 因为有断点在,所以被调试程序在断点位置的那条指令还没有执行。【按照程序指针总是指向即将执行的那条指令的原则,应该把程序指针指向这条要执行的指令,也就是倒退回一个字节(INT3的长度),指向本来指令的起始地址】
“烫烫烫烫”

为什么会有“烫烫烫烫”的出现?

编译器在编译调试版本时,会用0xCC来填充刚刚分配的缓冲区,这样,如果因为缓冲区或堆栈溢出时,程序指针意外指向了这些区域,那么就会因为遇到INT3指令而马上中断到调试器。

其他用途:内存对齐

断点API

用户模式:

#include <Windows.h> DebugBreak();

内核模式:

DbgBreakePoint(); DbgBreakePointWithStatus()

最新回复(0)