软件调试笔记5 - 断点和单步执行: 软件断点

软件断点

INT3是经常使用的断点命令,可以手动插入一条INT 3指令。



在调试器中设置断点

当我们在调试器中对某一行设置断点时,调试器会把本来指令的第一个字节保存起来,然后写入一条INT 3指令0xCC,所以设置和取消断点的时候只需要保存和恢复一个字节。

另外虽然断点所在的文件跟行位置保存在一个文件里,但是该文件并不保存每个断点处应该被INT 3指令替换掉的那个字节,因为这种替换是在启动调试时和调试过程中动态进行的。这也就是为什么在编辑的时候,甚至可以将断点设置到注释行,但是真正调试的时候,会将这些断点设置到目标代码的内存映像中,也就是要将断点位置对应的指令的第一个字节先保存起来,再替换成0xCC,称为落实断点resolve breakpoint.


断点命中

当CPU执行到INT 3时,会产生断点异常即breakpoint exception, #BP,并跳转执行异常处理例程。在跳转之前,CPU会保存当前的执行上下文,包括段寄存器,程序指针寄存器等。在WINDOWS保护模式下的多任务系统,INT3 处理函数是内核函数KiTrap03,因此CPU会从用户态转入内核模式。内核例程会把这个异常通过调试子系统以调试事件的分形式分发给用户模式的调试器,并等待调试器的回复。收到回复后,调试子系统层层返回,最后返回到异常处理例程,异常处理例程执行中断返回命令,使被调试的程序继续执行。


恢复执行

当用户希望恢复被调试程序时,调试器通过API通知调试子系统,导致系统内核的异常分发函数返回到异常处理例程,然后通过IRET/IRETD指令触发一个异常返回动作。注意此时的断点指令已经被替换成本来的指令,于是程序会从断点位置的原来指令继续执行。


INT3特殊用途



断点API



软件断点局限性




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值