这里要区分CPU级的异常,还是软件层次的异常。CPU执行INT 2D时总是会产生异常(TRAP)。操作系统也总会收到和分发这个异常。按照异常分配的原则,有人处理了就不会继续分发,所以如果是内核调试例程声明处理了这个异常,那么用户态的代码就不会收到[软件]异常了。
有否调试器的差异就是调用KdpStub(没有调试器)还是KdpTrap(有调试器),分发异常时不需要做判断,因为调试器函数已经把函数指针(KiDebugRoutine)的指向设置好了。
qiuyuluo wrote:就是说DebugPort不为零的话,那么调用KiDebugRoutine,否则就直接DbgkForwardException发往调试器。
应该为“就是说DebugPort为零的话.......”为零代表没有用户态调试器。
qiuyuluo wrote:就是说用户态调试器如vc调试器或ollydbg也是KdpTrap?
KdpTrap是内核调试引擎(KD)的接口函数,是用来做内核态调试的,它与用户态的调试器没有必然关系。用户态调试器是不需要关心下面是不是启用了内核调试的。
如果你有《软件调试》,那么先看一下第3篇的篇扉,然后仔细读一下第9、10章(用户态调试)和第18章(内核态调试)。它们是两套"系统"。