单步执行的原理

    在保护模式下,处理器会在一些特殊情况下产生 异常中断,也就是出现某种特定情况,就终止当前正在执行的程序,跳转到一个(由操作系统指定的)中断处理函数。根据 异常中断 的不同,以及其他情况,选择是否跳回原先执行的程序,或是启动其他程序,或是干脆宕机

   此表是处理器已经定下的,内部中断。 

中断向量号   触发原因
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寄存器的状态等直到用户按下继续执行的按钮。若没有设置调试断点,就将执行权交回给被调试的程序继续执行下一条指令,然后再触发调试异常中断。。。。。如此不断循环判断执行,直到结束。
   (由于每条指令,都会进行这些判断,被调试的程序执行速度,一般与正常状态下的执行速度慢上好几个数量级

   以上,就是调试器的基本原理,更多的信息,你可以到 看雪 之类的网站看看。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值