实际问题:
当程序因未捕获的异常而崩溃时,“在 Windows 中”会发生什么情况?
是否有我可以 Hook 的 dll 函数来记录有关崩溃的一些基本信息?
上下文:
我打算编写一个程序来收集有关在我的本地电脑上崩溃的任何应用程序的一些非常基本的信息。我希望我可以执行一个简单的方法来记录有关崩溃的一些信息,其方式类似于 Visual Studio 生成对话框的方式,让您在程序崩溃时对其进行调试。
最佳答案
托管异常是使用常规的 Windows 结构化异常处理机制实现的。异常代码是 0xe0434f4d。 Windows 会寻找愿意处理异常的异常处理程序。如果代码在堆栈上没有事件的 try block ,或者没有 catch block 愿意捕获托管异常,那么托管代码中的最后一击就是 AppDomain.UnhandledException 事件。
如果未实现,则异常处理切换到非托管处理,使用 SetUnhandledExceptionFilter 设置的异常过滤器将获得机会。如果做不到这一点,Windows 始终会提供一个默认处理程序。通常调用 WER,即 Windows 错误报告程序。这为用户提供了一个对话框,用于将异常详细信息发送给 Microsoft。不要期望任何结果。
当它超出 AppDomain.UnhandledException 时,有关托管异常的所有信息都将丢失。没有堆栈跟踪,没有异常消息。只有您已经知道的异常代码和一个您不会用到的异常地址,因为代码是由 JIT 编译器动态生成的。
务必在最后喘息阶段捕获异常,为 AppDomain.UnhandledException 编写事件处理程序。记录 e.ExcdeptionObject.ToString() 的值并使用 Environment.Exit() 终止程序。还要注意 Windows 窗体代码中的 Application.ThreadException 事件和 WPF 代码中的 Dispatcher.UnhandledException 事件。它们是在处理 UI 线程上的事件时引发的异常的后挡板。
关于.net - 当 .net 程序由于未捕获的异常而退出时,操作系统级别会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2949410/