第三章系统机制 (p 107 p 117 )2009621

1. APC

2. 异常分发

1) 异常是一个同步条件 。。

2)异常包括那些?常见的有调试器断点异常 。。除0异常 。。溢出 。。内存访问违例。。。

这些异常在IDT中处于最靠前的位置 。。从IDT0 --- IDT11  IDT0就是 除0 错误异常 。。。

3)异常如何被捕获? 目前只知道 内核以透明与用户程序的方式捕获异常 。。具体的还不知道 ?

4)异常如何分发处理 ?

当cpu捕获异常时, cpu将控制权转交给 陷阱处理器 。。陷阱处理器在内核栈中建立陷阱帧。。。这样在异常被处理后还能恢复到异常发生的地方继续执行。

然后异常分发器 开始发挥作用。。

a. 对于内核模式异常。。。 异常分发器只是简单的调用一个routine找到一个异常处理器 。。然后将该异常交给异常处理器执行。。 书上说 。。。未处理的内核异常是很严重的错误。。所以 可以假定。。总是可以找到一个异常处理器。。

b. 对于用户模式异常。。

windows子系统有一个调试端口和一个异常端口 。。。通过他们 接受用户进程的异常通知。

处理过程如下:

1)首先 查看产生该异常的进行有没有调试进程。。。有。。在xp下。。异常分发器会向该进程相关 的调试对象发送一个调试器对象消息 。。

2)上述没有处理 。。。windows切换到用户模式下。。然后copy 陷阱帧到content结构中。。并查找一个异常处理器。。然后执行。。。

3)继续。。。切换到内核模式下。。。给调试器进程发第二次消息。。。(大名鼎鼎的 second chance)

4) 如果存在异常端口。。内核向该端口发异常通知。。csrsss会受到该通知。。然后弹出一个对话框通知用户。。然后终止进行。。

5)上述都失败。。。则交给默认的异常处理器完成 。。。便是终止发生异常的进程。。。

 

 

未处理的异常。。。

该异常实在进程或线程启动过程中声明的。。

一般是:

void win32StartProcess()

{

      __try{

            DWORD  ld = lpStartAddress(pa);

          ExitThread( ld );

           }__except(UnhandlerdExceptionFilter )

            {

                  GetEx.........

                 ExitProcess();

      }

}

 

7) 相关的注册表内容。。。。

HKLM\Microsoft\windows NT\currentVersion\AgDebug 

值:

1  Auto  自动启动调试器 。。 

Debugger  指向一个调试器路径。。。。

默认的调试器是: C:\WINDOWS\system32\drwatson.exe

8) windows  xp 错误报告机制。。。

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/herso/p/1507983.html