windows系统里,为了保证系统内核的强壮和稳定,为了保证用户程序的强壮和稳定,提供了异常处理机制,来帮助程序员和系统使用人员处理异常。简单来说,当CPU执行代码时,发生异常,会把异常告知操作系统,操作系统首先会让程序自身处理这个异常,程序自身有能力(程序中注册的有异常处理函数)处理,程序就继续运行;程序自身没有能力处理(程序中没有注册异常处理函数),这个异常还没有被处理,就有操作系统来处理,就提示用户是调用调试器调试还是结束程序。如果在有调试器参与的情况下,程序出现异常,操作系统不会把异常处理权交给程序自身而是调试器,调试器可以把处理权继续转交给程序,也可以自己处理。为了完成前面讲的过程,Windwos信息提供了SEH和VEH两种处理机制。下面分别简单介绍。
一、SEH异常处理机制

SEH是windows操作系统异常处理机制,叫结构化异常处理,在程序源代码中使用__try,__except,__finally关键字来具体实现。

Windows操作系统(自Windows95起),对每个用户线程,都设立一个异常处理帧链表来处理异常事件。该链表的每个异常处理帧由两个成员组成,分别是链表上一项地址、当前异常处理器地址,组成了结构_EXCEPTION_REGISTRATION_RECORD。异常处理器是指一个处理异常的回调函数(callback function)。线程信息块(thread information block)的开始处(即FS:[0]指向的内存,FS是CPU的一个段寄存器)保存了异常处理帧链表的表头项的地址。程序执行遇到异常事件而中断时,操作系统的RtlDispatchException函数会从FS:[0]指向的链表表头依次调用每个节点包含异常处理回调函数,直到某个异常处理回调函数的返回值为0表示已经处理该异常,该线程可以恢复执行。链表最末一项是操作系统在装入线程时设置的指向kernel32!UnhandledExceptionFilter函数,该函数总是向用户显示“Application error”对话框。上述异常处理器程序及链表,是由用户程序自己安装的。链表各节点保存在程序调用栈(call stack)上。Windows异常处理机制支持嵌套异常的处理,即在执行异常处理回调函数时再次发生异常。这种情况下仍遵照普通异常处理机制,操作系统RtlDispatchException函数再入处理新出现的嵌套的异常。嵌套的异常的处理函数得到DispatcherContext参数值即为在执行时发生了新异常的异常帧的地址。

标签: none

添加新评论