c# – .NET中非托管线程的异常

c# – .NET中非托管线程的异常,第1张

概述如何处理我的应用程序终止时的情况,在终止之前使用回调? .NET处理程序在以下场景中不起作用,SetUnhandledExceptionHandler是正确的选择吗?它似乎具有以下讨论的缺点. 脚本 我想回复所有应用程序终止的情况,并在我们的.net应用程序中向我们的服务发送消息和错误报告. 但是,我有一个WPF应用程序,其中我们的两个测试人员获得绕过的未处理异常: > AppDomain.Unh 如何处理我的应用程序终止时的情况,在终止之前使用回调?

.NET处理程序在以下场景中不起作用,SetUnhandledExceptionHandler是正确的选择吗?它似乎具有以下讨论的缺点.

脚本

我想回复所有应用程序终止的情况,并在我们的.net应用程序中向我们的服务发送消息和错误报告.

但是,我有一个WPF应用程序,其中我们的两个测试人员获得绕过的未处理异常:

> AppDomain.UnhandledException(最重要的)
> Application.ThreadException
> dispatcher.UnhandledException

它们标记为SecuirtyCritical和HandleProcessCorruptedStateExceptions.
legacyCorruptedStateExceptionsPolicy在app.config中设置为true

我在野外的两个例子

>在某个地方初始化WPF时,运行wIDows10的VirtualBox会抛出一些vBoxd3d.dll(关闭vBox 3d accel“修复它”)
> Win8机器在系统上下文菜单中有“运行在显卡A / B上”的可疑选项,在WPF启动期间崩溃到某处(:/)但仅在应用了反破解工具时崩溃.

无论哪种方式,当实时,应用程序必须在终止之前响应这些类型的故障.

我可以使用非托管异常重现这一点,该异常发生在.net中的PInvoked方法的非托管线程中:

Test.dll的

BOol APIENTRY DllMain( HMODulE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved                     ){    switch (ul_reason_for_call)    {    case DLL_PROCESS_ATTACH:    case DLL_THREAD_ATTACH:    case DLL_THREAD_DETACH:    case DLL_PROCESS_DETACH:        break;    }    return TRUE;}DWORD WINAPI myThread(LPVOID lpParameter){    long testfail = *(long*)(-9022);    return 1;}extern "C" __declspec(dllexport) voID test(){    DWORD tID;    HANDLE myHandle = CreateThread(0,myThread,NulL,&tID);    WaitForSingleObject(myHandle,INFINITE);}

APP.EXE

class TestApp{    [Dllimport("kernel32.dll")]    static extern FilterDelegate SetUnhandledExceptionFilter(FilterDelegate lptopLevelExceptionFilter);    [UnmanagedFunctionPointer(CallingConvention.StdCall)]    delegate int FilterDelegate(IntPtr exception_pointers);    static int Win32Handler(IntPtr nope)    {        MessageBox.Show("Native uncaught SEH exception"); // show + report or whatever        Environment.Exit(-1); // exit and avoID WER etc        return 1; // thats EXCEPTION_EXECUTE_HANDLER,although this wont be called due to the prevIoUs line    }    [Dllimport("test.dll")]    static extern voID test();    [STAThread]    public static voID Main(string[] args)    {        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);        SetUnhandledExceptionFilter(Win32Handler);        test(); // This is caught by Win32Handler,not CurrentDomain_UnhandledException    }    [SecurityCritical,HandleProcessCorruptedStateExceptions ]    static voID CurrentDomain_UnhandledException(object sender,UnhandledExceptionEventArgs e)    {        Exception ex = e.ExceptionObject as Exception;        MessageBox.Show(ex.ToString()); // show + report or whatever        Environment.Exit(-1); // exit and avoID WER etc    }}

这可以处理裸WPF测试应用程序中vBoxd3d.dll的失败,当然还有WCF dispatcher和WinForms Application(为什么不)注册的异常处理程序.

更新

>在我试图使用它的生产代码中,处理程序似乎被其他调用者覆盖,我可以通过每100ms调用该方法来解决这个问题,当然这是愚蠢的.

>在出现vBox3d.dll问题的计算机上,执行上述 *** 作会将异常替换为clr.dll中的异常.
>它在崩溃时出现,传递给kernel32的托管函数指针不再有效.使用本机帮助器dll设置处理程序,它调用内部本机函数似乎正在工作.托管函数是一个静态方法 – 我不确定在这里应用pinning,也许clr正在终止…
>事实上,管理的代表正在被收集.没有“覆盖”处理程序.我已经添加了作为答案..不确定接受什么或者SO惯例在这里…

解决方法 问题中代码的问题是:

SetUnhandledExceptionFilter(Win32Handler);

由于委托是自动创建的,因此请注意:

FilterDelegate del = new FilterDelegate(Win32Handler);SetUnhandledExceptionFilter(del);

问题是,GC可以收集它,以及在最终引用之后的任何时刻创建的本机>托管thunk.所以:

SetUnhandledExceptionFilter(Win32Handler);GC.Collect();native_crash_on_unmanaged_thread();

总是会导致令人讨厌的崩溃,其中传递给kernel32.dll的处理程序不再是有效的函数指针.这可以通过不允许GC收集来解决:

public class Program{    static FilterDelegate mdel;    public static voID Main(string[] args)    {        FilterDelegate del = new FilterDelegate(Win32Handler);        SetUnhandledExceptionFilter(del);        GC.KeepAlive(del);  // do not collect "del" in this scope (main)        // You Could also use mdel,which I dont belIEve is collected either        GC.Collect();        native_crash_on_unmanaged_thread();     }}

其他答案也是一个很好的资源;不知道现在要回答什么.

总结

以上是内存溢出为你收集整理的c# – .NET中非托管线程的异常全部内容,希望文章能够帮你解决c# – .NET中非托管线程的异常所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1231405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存