当.net程序因未捕获的异常而退出时,OS级别会发生什么?

Ric*_*ich 10 .net windows exception

实际问题:

当程序从未捕获的异常崩溃时,"在Windows中"会发生什么?

是否有一个dll函数,我可以挂钩,记录一些关于崩溃的基本信息?

语境:

我打算编写一个程序,它将收集有关在我的本地PC上崩溃的任何应用程序的一些非常基本的信息.我希望我可以执行一个简单的方法来记录有关崩溃的一些信息,其方式与Visual Studio生成对话框的方式类似,以便在程序崩溃时调试程序.

Han*_*ant 5

使用常规Windows结构化异常处理机制实现托管异常.异常代码是0xe0434f4d.Windows寻找一个愿意处理异常的异常处理程序.如果代码在堆栈上没有活动的try块,或者没有catch块愿意捕获托管异常,则托管代码中的最后一个喘息是AppDomain.UnhandledException事件.

如果没有实现,则异常处理切换到非托管处理,使用SetUnhandledExceptionFilter设置的异常过滤器将获得一个镜头.如果做不到这一点,Windows总会提供默认处理程序.通常调用WER,即Windows错误报告程序.这为用户提供了一个对话框,可以将异常详细信息发送给Microsoft.不要指望任何事情.

当它超越AppDomain.UnhandledException时,所有关于托管异常的信息都将丢失.没有堆栈跟踪,没有异常消息.只是您已经知道的异常代码和异常地址,您将无需使用,因为代码是由JIT编译器动态生成的.

确保在最后一个喘气阶段捕获异常,为AppDomain.UnhandledException编写一个事件处理程序.记录e.ExcdeptionObject.ToString()的值并使用Environment.Exit()终止该程序.还要注意Windows窗体代码中的Application.ThreadException事件和WPF代码中的Dispatcher.UnhandledException事件.它们是处理UI线程上的事件时引发的异常的后退.