当前位置: 首页 > 编程语言 > C#

SetUnhandledExceptionFilter如何在.NETWinForms应用程序中工作?Share

时间:2023-04-10 13:59:47 C#

SetUnhandledExceptionFilter如何在.NETWinForms应用程序中工作?我正在做一个项目来增强我们的生产调试能力。目标是在任何未处理的异常上可靠地生成小型转储,无论它是托管异常还是非托管异常,也无论它发生在托管线程还是非托管线程上。我们目前使用优秀的ClrDump库,但它并不能完全提供我们需要的确切功能,而且我想了解异常过滤背后的机制,所以我开始自己尝试。我按照这篇博文开始自己安装SEH处理程序:http://blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx。此技术适用于控制台应用程序,但当我从WinForms应用程序尝试相同的操作时,我的过滤器不会因任何类型的非托管异常而被调用。ClrDump有什么我做不到的?ClrDump在所有情况下都会生成转储,因此仍然必须调用其异常过滤器...注意:我知道ADPlus的功能,我们也考虑过使用AeDebug注册表项...这些也是可能的,但是权衡取舍。谢谢,Dave//代码改编自LONGWINAPIMyExceptionFilter(__instruct_EXCEPTION_POINTERS*ExceptionInfo){printf("Nativeexceptionfilter:%Xn",ExceptionInfo->ExceptionRecord->ExceptionCode);嘟嘟声(1000,1000);睡眠(500);嘟嘟声(1000,1000);如果(oldFilter_==NULL){返回EXCEPTION_CONTINUE_SEARCH;}LONGret=oldFilter_(ExceptionInfo);printf("其他处理程序返回%dn",ret);返还;}#pragmamanagednamespaceSEHInstaller{publicrefclassSEHInstall{public:staticvoidInstallHandler(){oldFilter_=SetUnhandledExceptionFilter(MyExceptionFilter);printf("已安装的处理程序old=%xn",oldFilter_);}};Windows窗体有一个内置的异常处理程序,它默认执行以下操作:向用户显示一个对话框并防止应用程序终止。您可以通过在App.Config中设置jitDebugging=true来禁用第一个行为。这意味着阻止应用程序终止的最后机会是通过注册事件Application.ThreadException来捕获未处理的异常,例如在C#中:Application.ThreadException+=newThreading.ThreadExceptionHandler(CatchFormsExceptions);如果您决定不在此处捕获未处理的异常,则需要检查和/或更改HKLMSoftware.NetFramework下的注册表设置DbgJitDebugLaunchSetting。这具有我所知道的三个值之一:在VisualStudio中,转到“工具”>“选项”>“调试”>“JIT”以将此键设置为0或2。但值1通常是用户计算机上的最终值.请注意,对此注册表项的操作是在您正在讨论的CLR未处理异常事件之前执行的。然后您可以设置您讨论的本机异常过滤器。如果您希望GUI线程异常像非GUIGUI一样工作,以便以相同的方式处理它们,您可以这样做:Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);这是背景:在mageddGUI应用程序中,默认情况下,源自GUI线程的异常由分配给Application.ThreadException的任何内容处理,您可以像这样自定义:Application.ThreadException+=newSystem.Threading.ThreadExceptionEventHandler(Application_ThreadException);来自其他线程的异常由AppDomain.CurrentDomain处理。UnhandledException处理,您可以像这样自定义:AppDomain.CurrentDomain.UnhandledException+=newUnhandledExceptionEventHandler(Program.CurrentDomain_UnhandledException);分配给UnhandledException的工作方式与调用Win32SetUnhandledExceptionFilter完全相同。如果您的目标是创建小型转储然后使用它们,则需要使用Windows调试工具sos.dll。您需要生成小型转储MiniDumpWithFullMemory。然后,即使那样,你可能也不会拥有你想要的一切。System.Diagnostics.StackTrace获取调用的托管调用堆栈。SetUnhandledExceptionFilter安装一个处理程序,当Win32异常到达线程调用堆栈的顶部而未被处理时调用该处理程序。在许多语言运行时(包括托管)中,语言异常是使用Win32exceptions实现的。然而,托管运行时将在每个线程的顶部有一个顶级__try__catch(...)块,它将捕获任何win32到运行时异常并处理它们,而不让它们逃逸到Win32的顶级处理程序。在此级别注入处理程序需要特定运行时的知识,因为永远不允许异常逃逸到Win32的TheadProc处理程序。以上就是C#学习教程:SetUnhandledExceptionFilter在.NETWinForms应用程序中是如何工作的?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: