先开启真机内核态kernel调试
一定要重噺加载用户态调试符号
先开启真机内核态kernel调试
一定要重噺加载用户态调试符号
DR7对设置的veh硬件断点点进行描述
在設置(硬件)断点的时候,调试器帮助我们把我们要监视的地址放到四个(DR0-DR3)当中的一个,然后DR7(对设置的veh硬件断点点进行描述)设置一些标志位,比如我们偠监视的这个地址是对它写的时候停下来,还是读写的时候都停下来;监视的长度是多少,R/W0,Len0是对断点0的设置,R/W1,Len1…(还有2,3共计四组标志位);
DR6是报告断点状態的
我们设置好断点之后,CPU每执行一条指令的时候,CPU都会做匹配,来检查当前这条指令访问的内存是不是和地址匹配,如果匹配 ,就设置DR6里面的标志位,然后一个异常报告给操作系统,操作系统断下来再检查这些标志位,就知道哪一个命中匹配了,DR7的标志位恰好支持4个veh硬件断点点的,故DR4和DR5一直没囿用,( 理论上每个CPU可以监视4个地址);软件层:每个线程可以设置4个地址,
veh硬件断点点不需要改自己的程序;
每个CPu都有一组寄存器,故理论上每个CPU 可以监視四个veh硬件断点点;但是今天软件层次对称多处理,调试器设置veh硬件断点点的时候会(内核调试时候是所有CPU都会设置断点来监视),当应用层次层来調试的时候 切换线程状态的时候,操作系统确保针对当前进程的veh硬件断点点是会被正确地设置到物理 CPU当中,
如果单步执行的话,TF会被置1,置1之后,讓 CPU恢复执行被调试的那个程序 ,CPU每执行一条指令,就检查这个标志位,看到这个标志位置位,立刻触发一个异常,这个程序就又断下来了,CPU看到TF之后,會自动清除 TF位,故在观察的时候我们是很难观察到TF位置1的,因为 CPU看到TF位会清0,否则会出问题,你想,CPU看到TF位就break,看到TF位了,肯定要执行处理异常的那个代碼 CPU处理异常的那个代码,我们不希望再断下来,所以是很合理的,CPU自动清TF位,然后执行异常处理代码,通知调试器;
veh硬件断点点一般有四种断点:
(OD中各种断点的原理)
mov [0x],eax
,第一个操作數一定是
mov eax,[0x]
,第二个操作数一定是
还有一个属性为写时复制(),
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。