回复 楼主 vfdff
在保护模式下,处理器会在一些特殊情况下产生 “异常”中断,也就是出现某种特定情况,就终止当前正在执行的程序,跳转到一个(由操作系统指定的)中断处理函数。根据 异常中断 的不同,以及其他情况,选择是否跳回原先执行的程序,或是启动其他程序,或是干脆宕机
。
此表是处理器已经定下的,内部中断。
中断向量号 触发原因
0x00 除零错
0x01 调试异常
0x02 非可屏蔽中断 (NMI)
0x03 断点 (INT 3 指令)
0x04 溢出 (INTO 指令)
0x05 越界 (BOUND 指令)
0x06 无效的指令
0x07 无协处理器
0x08 双重错误
0x09 协处理器越界
0x0A 无效的 TSS
0x0B 段不存在
0x0C 栈溢出
0x0D 通用保护异常(内存引用或其他检查保护),Windows 9x 蓝屏就是它的杰作
0x0E 页错误
0x0F Intel 保留
0x10 协处理器错误
0x11-0x19 Intel 保留
在运行时,触发这些中断,有可能是程序无意间发生的(程序员没写好代码,或是操作系统的错误),还有可能是程序自动故意引发的(比如执行 ud2 汇编指定,会产生 中断向量号为 0x06 的 无效指令 异常中断)
仔细看看,可以发现中断向量号为0x01 的叫做 调试异常 的异常中断。说明这个是专门留给操作系统和程序作为调试用的。
怎么利用
调试异常中断 来制作调试器呢?
首先,程序执行前,需要通过一个叫做 加载器 的东西 将二进制机器指令从外存(硬盘,u盘等)加载到内存里面。加载器在加载程序时,会根据程序的执行文件类型,做一些处理(具体的和调试器没什么关系,就不解释了)。
而调试器,可以看做是一个特殊的加载器,它会在加载程序时,在每一个机器指令间,插入一条调试异常中断指令(int 0x01)。然后,在加载的程序执行时,每执行一条机器指令,就会引发一个调试异常,然后调试器从操作系统的调试异常处理函数那里接过执行权,进行判断,是否在这条指令后设置了调试断点?若设置了,就中断下来,显示程序与cpu寄存器的状态等直到用户按下继续执行的按钮。若没有设置调试断点,就将执行权交回给被调试的程序继续执行下一条指令,然后再触发调试异常中断。。。。。如此不断循环判断执行,直到结束。
(由于每条指令,都会进行这些判断,被调试的程序执行速度,一般与正常状态下的执行速度慢上好几个数量级
)
以上,就是调试器的基本原理,更多的信息,你可以到 看雪 之类的网站看看。
[
本帖最后由 miaowangjian 于 2010-5-28 01:47 编辑 ]