软件调试笔记5

来源:互联网 发布:window10c语言编程软件 编辑:程序博客网 时间:2024/05/13 08:22

软件断点

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



软件断点局限性




原创粉丝点击