最近重读了软件调试的18章,想的问题多了点,请教张老师。
想像一条普通的int 3, 虽然是陷阱类异常,但因为KiTrap03会将Eip-1,使得异常处理程序或者调试器中看到的eip指向int 3指令,
如果这个int 3是在调试器中设置的断点,调试器会将指令处的指令替换成int 3,调试器收到异常并且恢复执行后,会将这个int 3恢复成原来的指令并且从这个指令处开始执行。 如果这个int 3本身是程序里面的,调试器捕捉到这个异常后,恢复执行就会直接跳过这条指令?不知道这样的理解对不对?
也就是说KiTrap03的异常分发逻辑里会区分这个int 3是调试器设置的断点,还是程序代码本身就有的指令?
另外一个是关于书中第18章节,KiTrap2D的思考,我对它的工作流程还是挺好奇的,想像一下,是不是下面这样?
KiTrap2D-->初始化工作-->KiTrap03-->KiDispatchException-->
if(kernel debugger) --> KdpTrap
if( int 2d )
debugging service; return TRUE;
if( int 3 )
break into debugger;
else --> KdpStub
do nothing and return true
if( int 3)
return false;
....
感觉很复杂,难理解。
对于前两个问号,是这样的,调试器收到断点异常后,会查询自己的断点列表,如果不在其中,会使用不同的逻辑。恢复目标执行时不需要单步走出断点,只需要通过线程上下文递增EIP。