windows简单调试器源码2700行左右代码

简单调试器项目中on开头的函数为接收系统的调试事件并做相应的处理,简单调试器实现过程中主要的调试事件为异常事件,相应的处理函数为DispatchException。

在异常事件中访问异常、int3异常、单步异常是跟实现调试器功能密切相关的异常事件,这里用三个函数分别处理三个函数分别为OnExceptionAccess、OnExceptionBreakPoint、OnExceptionSingleStep。

异常处理函数中如果为调试器自己设置的异常程序就会停下来接收用户输入等待下一步处理,相应的用户交互函数为UserInput。

在于用户交互的过程中程序是通过一些列以Cmd开头的命令函数完成相应的功能。


断点相关:


int3断点相关:

int3断点分为临时断点和永久断点,设置断点时如果永久断点与临时断点重复需要把已经存在的临时断点转换为永久断点,其他断点重复的情况不需再次设置断点

临时断点使被调试程序中断以后,需要恢复被调试程序断点为原值,并把该临时断点删除。

永久断点使被调试程序中断以后,需要暂时恢复被调试程序断点为原值,然后配合单步执行过该永久断点,在单步异常中再次设置该永久断点。

删除断点把被调试程序断点恢复为原值,然后删除该断点

 

内存断点相关:

内存断点分为写入断点和访问断点,通过修改被调试程序内存属性为不可访问,然后在访问异常事件中处理内存断点。

设置内存断点,本程序限制内存断点长度不能超过一个分页,本程序会检测设置的内存断点是否跨内存分页,如果跨内存分页则自动把该断点拆分为两个不跨分页的内存断点。

因为内存访问属性包含内存写入属性,所以在设置内存断点时如果和之前已经存在的内存断点有重叠区域该程序提示用户设置断点失败。

本程序用map记录修改的内存分页起始地址以及对应的内存分页原属性。

设置新内存断点时查找map中该内存分页是否已经存在其他内存断点,如果存在只需添加该内存断点带内存断点表,如果不存在则修改该内存分页属性并存入map,然后添加该内存断点进入内存断点表

被调试程序发生访问异常时首先查询是否命中map中的内存分页,没有命中说明是程序自身的异常不做处理,如果命中map中的内存分页,首先暂时恢复该内存分页为原来的属性,然后继续查找内存断点表看是否命中具体的内存断点,如果命中具体的内存断点表,提示用户,没有命中具体的内存断点,调试程序单步走过该访问异常,然后在单步事件中恢复内存分页属性。

删除内存断点:

首先删除该条内存断点,然后查找内存断点表,查找是否存在与删除内存断点在同一内存分页上的其他内存断点,如果内存断点中不存在与删除内存断点在同一分页的断点,查找map中对应的内存分页,恢复该内存分页属性为原值,删除掉map中该内存分页记录,如果还存与删除内存断点在同一分页的内存断点,则不对map做处理。

 

硬件断点相关:

设置硬件断点,在单步异常中判断是否为硬件断点异常,如果命中硬件断点提示用户,命中硬件断点的情况下设置单步,在单步异常中恢复硬件断点。


附件中好像没有显示源码源码可以在这里下载:

http://download.csdn.net/detail/qihuanfengyun/8351005


windows简单调试器源码2700行左右代码

上一篇:IDEA配置免安装版tomcat的方法——配置篇


下一篇:C#中如何解码(decode)escape形式的Unicod