[调试器的设计]第二章 内存断点

关于内存断点的设计与实现
第二章 内存断点  9
2.1 问题的提出与分析  9
2.1.1 问题提出  9
2.2问题的解决  9
2.2.1 内断断点与内存分页的关系  9

同时附件为调试器的可执行程序(修复了一些小bug)
第一章节与第二章节的内容
以及pe解析部分的动态邻接表的源代码(我的代码写得很恶心,看的话做好心理准备,哈哈)

多谢张文君(金山毒霸)师姐指出了程序的一些小bug

                                                          第二章 内存断点
2.1 问题的提出与分析
2.1.1 问题提出
因为内存断点是调试器的一个难点,所以我们这里放在最前面讲,这样也可以避免在后面的设计中一些组合问题的产生。
一个内存分页可能会存在多个断点,一个断点可能会跨多个内存分页。某个内存分页可能不具有用户要设的断点属性。某内存分页具有读与写的权限,但是用户只下 了写的断点,如果将读的权限也一起拿掉,程序在读那块内存分页也要断下来,这样将大大的降低程序的效率,如何优化,以及断点信息与内存信息的存储。

2.2问题的解决
2.2.1 内断断点与内存分页的关系
一个内存分页可能会存在多个断点,一个断点可能会跨多个内存分页。这个不由的让我们想起第一阶段的学生管理系统(一个学生可以选任意门课程,一门课程可能有任意个学生选)。其实二者的关系是一样的,因为是多对多的关系,所以我们要构造出第三张表来管理他们的关系。
为了检测用户下断点有效性等问题,在下断点的时候取得那个内页分页信息,判断地址是否有效,然后再判断是否具有要断下来的属性。对一个没有读属性的内存分页下读断点是无效的。
为了提高效率,中间表用了二个,一个是以内存页序号为主键,一个是以断点序号为主键,使用动态邻接表(长度自动增长)存储,这样可以提高程序的处理速度。 当调试器收到异常信息,首先取得产生异常的地址,以及错误编码,再通过异常地址取得内存页的序号,再通过内存页的序号去邻接表里查他有多少个断点,如果当 前有内存断点的话,恢复内存页原属性,然后再判断当前位置是否处于用户设的断点地址内,是的话,处理用户的请求,最后设单步,在单步中再将内存页的属性设 成新的属性。

添加内存断点流程图                    处理异常流程图
名称:  1.jpg
查看次数: 603
文件大小:  63.7 KB

内存断点本来就是一件很耗资源的,为了最大的提升效率, 当处理某内存分页具有读写的权限,而用户只下读或写的权限的这类情况,我们可以通过对原属性的分析,然后再减去用户新的属性,再根据结果生成新的属性,因为移除某个属性,并不能单单的通过去除某个位而完成。
相关记录项的结构:
 名称:  2.jpg
查看次数: 611
文件大小:  73.1 KB

内存页与断点关系表(邻接表):
名称:  3.jpg
查看次数: 600
文件大小:  29.7 KB

 

 

附件:

第二章附件

 

posted @ 2015-05-10 11:04  银河彼岸  阅读(806)  评论(0编辑  收藏  举报