当前位置:  开发笔记 > 编程语言 > 正文

SetUnhandledExceptionFilter如何在.NET WinForms应用程序中工作?

如何解决《SetUnhandledExceptionFilter如何在.NETWinForms应用程序中工作?》经验,为你挑选了1个好方法。

我正在开发一个项目来增强我们的生产调试功能.我们的目标是在任何未处理的异常上可靠地生成minidump,无论异常是托管还是非托管,以及它是在托管或非托管线程上发生的.

我们目前使用优秀的ClrDump库,但它并没有完全提供我们需要的确切功能,我想了解异常过滤背后的机制,所以我开始尝试自己.

我开始关注这篇博客文章,自己安装一个SEH处理程序:http: //blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx.这种技术适用于控制台应用程序,但是当我从WinForms应用程序尝试相同的事情时,我的过滤器不会被调用任何种类的非托管异常.

ClrDump可以做什么,我不做什么?ClrDump在所有情况下都会生成转储,因此必须仍然调用其异常过滤器...

注意:我知道ADPlus的功能,我们也考虑过使用AeDebug注册表键......这些也是可能性,但也需要权衡.

谢谢,戴夫

// Code adapted from 
LONG WINAPI MyExceptionFilter(__in struct _EXCEPTION_POINTERS *ExceptionInfo)
{
   printf("Native exception filter: %X\n",ExceptionInfo->ExceptionRecord->ExceptionCode);

   Beep(1000,1000);
   Sleep(500);
   Beep(1000,1000);

   if(oldFilter_ == NULL)
   {
      return EXCEPTION_CONTINUE_SEARCH;
   }

   LONG ret = oldFilter_(ExceptionInfo);
   printf("Other handler returned %d\n",ret);

   return ret;
}



#pragma managed

namespace SEHInstaller
{
   public ref class SEHInstall
   {
   public:
      static void InstallHandler()
      {    
         oldFilter_ = SetUnhandledExceptionFilter(MyExceptionFilter);
         printf("Installed handler old=%x\n",oldFilter_);
      }


   };
}

RoadWarrior.. 9

Windows窗体有一个内置的异常处理程序,默认情况下执行以下操作:

在以下情况下捕获未处理的托管异常:

没有附加调试器,和

窗口消息处理期间发生异常,并且

App.Config中的jitDebugging = false.

向用户显示对话框并阻止应用终止.

您可以通过在App.Config中设置jitDebugging = true来禁用第一个行为.这意味着你停止应用程序终止的最后机会是通过注册事件Application.ThreadException来捕获未处理的异常,例如在C#中:

Application.ThreadException += new Threading.ThreadExceptionHandler(CatchFormsExceptions);

如果您决定不在此处捕获未处理的异常,则需要在HKLM\Software.NetFramework下检查和/或更改注册表设置DbgJitDebugLaunchSetting.这是我所知道的三个值中的一个:

0:显示用户对话框询问"调试或终止".

1:让CLR处理异常.

2:启动DbgManagedDebugger注册表项中指定的调试器.

在Visual Studio中,转到"工具">"选项">"调试">"JIT"将此键设置为0或2.但是值1通常是最终用户计算机上的值.请注意,在您讨论的CLR未处理的异常事件之前,将对此注册表项执行操作.

然后,您可以设置您讨论的本机异常过滤器.



1> RoadWarrior..:

Windows窗体有一个内置的异常处理程序,默认情况下执行以下操作:

在以下情况下捕获未处理的托管异常:

没有附加调试器,和

窗口消息处理期间发生异常,并且

App.Config中的jitDebugging = false.

向用户显示对话框并阻止应用终止.

您可以通过在App.Config中设置jitDebugging = true来禁用第一个行为.这意味着你停止应用程序终止的最后机会是通过注册事件Application.ThreadException来捕获未处理的异常,例如在C#中:

Application.ThreadException += new Threading.ThreadExceptionHandler(CatchFormsExceptions);

如果您决定不在此处捕获未处理的异常,则需要在HKLM\Software.NetFramework下检查和/或更改注册表设置DbgJitDebugLaunchSetting.这是我所知道的三个值中的一个:

0:显示用户对话框询问"调试或终止".

1:让CLR处理异常.

2:启动DbgManagedDebugger注册表项中指定的调试器.

在Visual Studio中,转到"工具">"选项">"调试">"JIT"将此键设置为0或2.但是值1通常是最终用户计算机上的值.请注意,在您讨论的CLR未处理的异常事件之前,将对此注册表项执行操作.

然后,您可以设置您讨论的本机异常过滤器.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有