微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当.net程序由于未捕获的exception而退出时,在操作系统级别会发生什么情况?

实际问题:

一个程序从一个未被捕获的exception崩溃时,在Windows中会发生什么?

有没有一个DLL函数,我可以挂钩,logging一些关于崩溃的基本信息?

语境:

.NET的安全/允许的文件名清理

当X509Certificate2对象的智能卡被移除时的事件

如何在Windows中以兼容模式启动应用程序会影响应用程序,我该如何检测它?

dynamic识别控件的容器(GroupBox等)

问题与Windows服务以编程方式重新启动自己

我正在计划编写一个程序,收集有关在本地PC上崩溃的任何应用程序的一些非常基本的信息。 我希望我可以执行一个简单的方法来logging关于崩溃的一些信息,类似于Visual Studio生成对话框的方式,让你在崩溃时debugging一个程序。

为什么我在尝试本地安装cs-script时出错?

为什么Console.Readline没有按预期执行

.NET EXE和DLL之间的堆栈/堆区别

如何在C#系统中设置HotKey

有一种更简单的方法来在C#控制台应用程序中使用Windows ctrl + v(粘贴)function吗?

受管理的异常使用常规的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线程中的事件时引发的异常的后退停止。

对于本地应用程序,您可以使用以下功能

SetUnhandledExceptionFilter (捕获未捕获的异常)

_set_purecall_handler (在C ++中捕获纯虚拟调用

此外,你可以使用AddVectoredExceptionHandler,但我不会推荐这个,因为它也拦截捕获到的异常。

传递给SetUnhandledExceptionFilter的函数指针获取一个结构作为输入参数,其中包含有关异常(reason,registers,…)的所有信息。

在我的应用程序中,我使用SetUnhandledExceptionFilter来创建应用程序转储(使用DBGHELP.DLL dll函数MiniDumpWriteDump ),如果应用程序崩溃。 小心不要在这功能上做太多。 由于您的应用程序已经崩溃,所以不能保证任何进一步的逻辑将仍然有效(例如访问您自己的数据结构,这可能是正确的,可能会导致进一步的崩溃)。

考虑购买由John Robbins撰写的“ 调试Microsoft NET 2.0应用程序 ”一书。 我从这本书中学到了很多东西,包括这个技巧。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐