gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:03:49 26 4
gpt4 key购买 nike

我正在做一个项目来增强我们的生产调试能力。我们的目标是在任何未处理的异常上可靠地生成小型转储,无论异常是托管的还是非托管的,以及它是发生在托管线程还是非托管线程上。

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

我首先按照这篇博客文章自己安装了一个 SEH 处理程序:http://blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx .此技术适用于控制台应用程序,但当我在 WinForms 应用程序中尝试相同的操作时,我的过滤器不会因各种非托管异常而被调用。

ClrDump 可以做哪些我没有做的事情? ClrDump 在所有情况下都会生成转储,因此仍必须调用其异常过滤器...

注意:我知道 ADPlus 的功能,我们也考虑过使用 AeDebug 注册表项...这些也是可能的,但也有其权衡。

谢谢,戴夫

// Code adapted from <http://blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx>
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_);
}


};
}

最佳答案

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 未处理异常事件之前起作用。

然后您可以设置您讨论过的 native 异常过滤器。

关于c# - SetUnhandledExceptionFilter 如何在 .NET WinForms 应用程序中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/233255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com