断点&&单步执行

本文详细介绍了软件断点的实现原理,解释了调试器如何使用INT3指令(0xCC)来设置断点,并讨论了断点在调试过程中的作用。此外,还探讨了INT3指令在内存对齐及断点API中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件断点

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

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

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

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

其他用途:内存对齐

断点API

用户模式:

#include <Windows.h>
DebugBreak();

内核模式:

DbgBreakePoint();
DbgBreakePointWithStatus()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值