10.默认过滤器和JIT调试
假设一个异常到了用户态,找了所有异常处理函数,都不处理,怎么办,那些应用程序的那些try,handle都说不处理,这时候这样的异常叫做无人处理的异常,此时就会使用默认的异常处理函数,默认的异常处理函数对于应用程序来说有几个,对于初始线程,BaseprocessStart会注册一个默认的异常处理器;
对于vc编译器编译器编译的,它会插入一个启动函数,它里面也有一个异常处理器;
对于非初始线程,线程的启动函数它有一个默认的异常处理器;
内核态它也有默认处理,它会崩溃,显示BSOD;
应用程序的默认处理就是弹出这些对话框;
image.png这些都代表了应用程序发生了异常,程序自己又不处理,交给操作系统默认处理,这些对话框的名字叫AE对话框!
这些对话框弹出来都是有特殊的机制的,Vista是用wer创建一个特殊的进程来显示UI,XP是用dwwin创建一个特殊的进程,之前呢是Windows子系统服务进程CSRSS,它报告这样的特殊对话框,这个对话框就是error机制;
以Win7为例:
image.png
上边最左边发生出错的那个进程,全都不处理,默认的那个异常处理是采用默认逻辑,默认逻辑有一个动作是采用默认LPC端口发给WER的服务进程,专门有一个的,Windows错误报告处理,服务进程收到请求之后,创建WER
fort的界面,然后这个界面就给大家看,这个处理意见还可以再返回来影响处理过程;
做默认处理,有一个著名函数叫UnhandleExceptionFilter;
image.png
UnhandleExceptionFilter这个函数很复杂,伪代码见软件调试P322,下面讲一讲这个函数的核心逻辑:
它有三个功能:
-
调用顶层异常过滤函数:
SetUnhandledExceptionFilter
通过这个API可以设立一个过滤函数,此过滤函数在这种情况下可能被调用,这个API有一个缺点,A设了就是A的,B设置了就会把A的覆盖掉,所以说这个函数你设置了,但是说你发生异常的时候不一定还是你设置的,因为别人调用了把你的覆盖掉了,所以说这种方式不是太可靠,但是动作是在这里做的; -
UnhandledExceptionFilter
另外一个作用是通知应用程序作用; -
启动JIT调试器(即时调试,即时调试代表这Windows操作系统的强大支持),即时调试就是在注册表里里面,在这个表键下,AEDebug,(AE代表Applycation error)
image.png
image.png
-p 指定被调试进程 -e(even)
它们的具体对话代表着非常完美,比如说应用程序出错了,代表开始调试它,弹出应用程序对话框,你启用了即时调试,对话框里就会多一项你要不要调试,你想要调试,被调试进程就会启用调试器,也可以自动可以开始这个过程,(5'37")
image.png
自动的话,被调试进程这里先创建CreateEvent(),然后创建调试器进程,然后就开始等调试器进程和Event