实际问题:
当程序因未捕获的异常而崩溃时,“在 Windows 中”会发生什么?
是否有一个 dll 函数,我可以挂接该函数来记录有关崩溃的一些基本信息?
Context:
我计划编写一个程序,该程序将收集有关在我的本地电脑上崩溃的任何应用程序的一些非常基本的信息。我希望能够执行一个简单的方法来记录有关崩溃的一些信息,其方式类似于 Visual Studio 生成一个对话框,让您在程序崩溃时对其进行调试。
托管异常是使用常规 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 线程上的事件时引发的异常的后备程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)