硬件点的实现功能有:(断下,硬件访问,硬件写入)类型 byte,word,dword
英特尔硬件设计中:DR0~DR3是存放断下地址硬件,DR4~DR5为保留的。DR6是状态硬件说明引起断点的原因,DR7是触发硬件控制位
硬件断点产生的 异常是STATUS_SINGLE_STEP也就是单步(如果有别的单步需要多条件处理)
单步寄存器位 TF=0 是置触发L0 TF=1 是置G0触发
G0是全局断点,L0是局部断点,但是windows只能设置局部断点L0
G1L1~G3L3是用来控制 dr1~dr3 断点触发(前提是已经存放需要断下的地址进去了)
R/W0~R/W3 触发断点条件 00b只执行 01b写入数据 10b i/o端口 11b读写
GD 用于保护DRx =1 则会进入1号陷阱 保证调试器完全控制DRx
DR6的 B0~B3 判断 DR0~dr3 谁引发的调试陷阱
第一步:设置 iDr0存放地址 与触发条件
触发后就会进入单步异常
第二步:
单步异常触发框架,DR6的 b0~b3用来判断
以DR6为例的b0置1为例,先把dr7复原,fegFlag置TF单步标志=1,g_isBPHStep单步触发=true进行下次单步判断定义触发开关
在单步call里 判断是否继续单步,把DR0硬件断点设置触发,单步触发开关复原false,DBG_CONTINUE表示异常已经处理不往外抛
第三种 触发有条件的硬件断点
把esp作为地址来触发
单步call 判断是否继续单步
--------------------------------------------------------结束