内存断点原理

内存读写断点的实现,众所周知是把相关内存页属性设置为PAGE_NOACCESS,这样当此页内内存被读写的时候会有异常传给调试器。
但异常传给调试器以后的事,就很少有资料说起了,可能我比较孤陋寡闻,研究了几天才搞明白,原来当异常传给调试器时候,debugee进程被挂起,调试器把内存页属性重新修改回去,同时设置一个单步调试断点。这样debugee进程才可以正常执行过去,否则会一直被挂起。因为被设置了单步调试断点,所以执行一个指令就再次挂起,交给调试器去处理。这时候调试器把页面属性重新修改为PAGE_NOACCESS就可以了。