断点恢复执行时的设置

来源:互联网 发布:内网22的端口怎么设置 编辑:程序博客网 时间:2024/06/15 15:34

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

这里有一个问题,前面我们说当断点命中中断到调试器时,调试器会把所有断点处的INT 3指令恢复成本来的内容。因此,在用户发出了恢复执行命令后,调试器在通知系统真正恢复程序执行前,调试器需要将断点列表中的所有断点再落实一遍。但是对于刚才命中的这个断点需要特别对待,试想如果把这个断点处的指令也替换为INT 3,那么程序一执行便又触发断点了。但是如果不替换,那么这个断点便没有被落实,程序下次执行到这里时就不会触发断点,而用户并不知道这一点。对于这个问题,大多数调试器的做法都是先单步执行一次。也就是说,先设置单步执行标志(下一节将详细讨论),然后恢复执行,将断点所在位置的指令执行完。因为设置了单步标志,所以,CPU执行完断点位置的这条指令后会立刻再中断到调试器中,这一次调试器不会通知用户,会做一些内部操作后便立刻恢复程序执行,而且将所有的断点都落实(使用INT 3替换)。如果用户在恢复程序执行前,已经取消了当前的断点,那么就不需要先单步执行一次了。