C# 检测异常是否为损坏状态异常

C# 检测异常是否为损坏状态异常,c#,exception,visual-studio-2013,corrupted-state-exception,C#,Exception,Visual Studio 2013,Corrupted State Exception,我有一些调用Rotativa的代码,它调用wkhtml2pdf。从该行为中,我怀疑wkhtml2pdf.exe导致抛出损坏的状态异常(CSE)。如果抛出CSE,我想捕获并记录它,以便跟踪它发生的位置 当我让应用程序在调试器中运行一夜时,当我回来时VS已经关闭。有时它重新启动了,有时没有。由于怀疑内存损坏,我开始研究并偶然发现了CSE处理 我在做这样的事情: [HandleProcessCorruptedStateExceptions] void DoStuff() { try

我有一些调用Rotativa的代码,它调用wkhtml2pdf。从该行为中,我怀疑wkhtml2pdf.exe导致抛出损坏的状态异常(CSE)。如果抛出CSE,我想捕获并记录它,以便跟踪它发生的位置

当我让应用程序在调试器中运行一夜时,当我回来时VS已经关闭。有时它重新启动了,有时没有。由于怀疑内存损坏,我开始研究并偶然发现了CSE处理

我在做这样的事情:

[HandleProcessCorruptedStateExceptions]
void DoStuff()
{
     try
     {
          DOThatThingThatMakesTheDebuggerHaltAndShutDown();
     }
     catch(Exception ex)
     {
            //how do I detect that it's a CSE in here, so I can log it especially blatantly
     }
}
是否有一种方法可以检测异常是否是常规捕获中的CSE

我看到他们有两个一般例外条款。内部的不处理CSE并设置标志。如果调用外部的一个时没有标记,那么它就是CSE,但我希望它更干净。我想做的是记录这个糟糕的状态,然后将其传递给应用程序以正常冒泡

当我查看导致VS2013停机的事件日志中的错误时,我发现:

应用程序:devenv.exe框架版本:v4.0.30319说明: 由于未处理的异常,进程已终止。例外信息: 异常代码c0000005,异常地址4DA44C1F堆栈:at Microsoft.VisualStudio.Debugger.Clr.NativedKMCRLModuleInstance.ProcF4BC786AEBAC294EE9C4C0BB1B0F56A7(IntPtr, IntPtr ByRef)在 Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance.GetMetaDataImport() 在 Microsoft.IntelliTrace.Concord.MetadataHelper..ctor(Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance) 在 Microsoft.IntelliTrace.Concord.Integration.CpdeNotifyPointServiceAdapter.InstallBreakpoint(Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance, Microsoft.VisualStudio.Debugger.Interop.Internal.NP\u安装请求)
在 Microsoft.IntelliTrace.Concord.Integration.CpdeNotifyPointServiceAdapter.BindToModule(Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance) 在 Microsoft.IntelliTrace.Concord.IntelliTraceProcessState.AlertModuleLoad(Microsoft.VisualStudio.Debugger.DkmModuleInstance) 在 Microsoft.IntelliTrace.Concord.NotifyPoints.NotifyPointManager.OnModuleInstanceLoad(Microsoft.VisualStudio.Debugger.DkmModuleInstance, Microsoft.VisualStudio.Debugger.DKM工作列表, Microsoft.VisualStudio.Debugger.DkmEventDescriptorS)位于 Microsoft.VisualStudio.Debugger.EntryPoint.IDkmModuleInstanceLoadNotification_OnModuleInstanceLoad(IntPtr, IntPtr,IntPtr,IntPtr)

其次是:

故障应用程序名称:devenv.exe,版本:12.0.30501.0,时间 戳记:0x5361f453故障模块名称:vsdebugeng.impl.DLL,版本: 12.0.30501.0,时间戳:0x5361f482异常代码:0xc0000005故障偏移量:0x00094c1f故障进程id:0x1c9c故障应用程序 开始时间:0x01cfe7cc0cf50465故障应用程序路径:C:\Program 文件(x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe 故障模块路径:C:\Program Files(x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\vsdebugeng.impl.DLL报告Id:097b17c6-5438-11e4-8409-001f2904053c


请记住,没有“腐败国家例外”这样的东西。这只是一个收集词,一组CLR团队认为“过分恶劣”的异常。他们故意不记录他们在那个集合中放置了什么样的异常,除了“大约有十几个”例外,而且它们是作为Windows SEH异常开始的。我只知道AccessViolationException肯定在这个集合中。在你的案子中撞车的那个。很普通,尽管他们来了也很肮脏

该功能被添加到.NET 4.0中,以帮助程序员使用
catch(exception)
捕获所有异常处理。然后让程序继续运行。这有一个恶作剧的诀窍,他们也捕捉到了非常恶劣的异常,这种异常是他们永远不应该捕捉的,因为它们保证是不可恢复的。经常是无意中。这导致的程序故障很难诊断,可能需要一段时间才能检测到错误行为

我可以推测在这个集合中还有哪些SEH例外。但这只是猜测。关键是你不必知道。任何具有[HandleProcessCorruptedStateExceptions]的方法都应该是外部异常处理程序,在线程入口激活。比如Main()。而SEH处理程序应该做的事情很少,只需让用户知道程序失败的原因并调用Environment.FailFast()

因此,没有该属性的编程
catch(Exception)
现在可以了,CLR在查找处理程序时将跳过它。你不可能不小心吞下这些肮脏的东西。您的案例可能有点不同,看起来像一个没有定义良好的线程入口点的外接程序。使用try/catch将方法体移动到另一个方法中,并忽略该方法上的属性。要由具有属性的方法调用,现在可以安全地假设它捕获了一个讨厌的对象


当然,要确保当它抓住你的时候,你不会让VS跑。调试器状态被炸成碎片,调试会话肯定已经结束,试图继续使用它的程序员将以糟糕的结局结束。因此,显示一个消息框并快速失败或重试。

异常的类型是什么?它是一个CSE,我刚刚添加了CSE处理代码,因为类型和调用堆栈是我所追求的…因为CSE没有被处理,我得到的只是一个暂停。。。我将从事件查看器中获得的信息添加到问题中您知道
异常的
类型吗?如果是这样,您可以使用
catch(CorruptedStateException ex)
来隔离特定的异常。没有CorruptedStateException这样的东西,CSE根本不是从异常派生出来的,它是一个完全不同的东西。您使用泛型(Exception ex)捕获它,并将注释添加到方法w