检测异常是否为损坏的状态异常
我有一些调用Rotativa的代码,它调用wkhtml2pdf。 我怀疑从行为,我看到wkhtml2pdf.exe导致损坏的状态异常(CSE)被抛出。 如果抛出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?
我看到他们有2个一般例外条款。 内部不处理CSE并设置标志。 如果外面的那个没有标志就被叫了,那么它是一个CSE,但我希望有更清洁的东西。 我想要做的就是记录这个不良状态,然后将它传递给应用程序以正常冒泡。
当我查看导致VS2013失败的事件日志中的错误时,我得到以下结果:
应用程序:devenv.exe Framework版本:v4.0.30319说明:由于未处理的异常,进程已终止。 异常信息:异常代码c0000005,异常地址4DA44C1F堆栈:位于Microsoft.VisualStudio.Debugger.Clr.NativeDkmClrModuleInstance.ProcF4BC786AEBAC294EE9C4C0BB1B0F56A7(IntPtr,IntPtr ByRef)at Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance.GetMetaDataImport()at Microsoft.IntelliTrace.Concord .MetadataHelper..ctor(Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance)at Microsoft.IntelliTrace.Concord.Integration.CpdeNotifyPointServiceAdapter.InstallBreakpoint(Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance,Microsoft.VisualStudio.Debugger.Interop.Internal.NP_INSTALL_REQUEST )
Microsoft.IntelliTrace.Concord.Integration.CpdeNotifyPointServiceAdapter.BindToModule(Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance)在Microsoft.IntelliTrace.Concord.IntelliTraceProcessState.AlertModuleLoad(Microsoft.VisualStudio.Debugger.DkmModuleInstance)在Microsoft.IntelliTrace.Concord.NotifyPoints (Microsoft.VisualStudio.Debugger.DkmModuleInstance,Microsoft.VisualStudio.Debugger.DkmWorkList,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 Files文件(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
请记住,没有像“CorruptedStateException”这样的事情。 这只是一个收集词,CLR团队挑选的一组例外是“过分讨厌”。 他们故意不记录他们在该集中放置了哪些类型的例外情况,除了“大约十几个”,并且他们是以Windows SEH例外开始的。 我知道的唯一一个绝对是在AccessViolationException中。 在你的情况下撞到VS的那个。 很常见,就像他们来的时候那样讨厌。
该功能被添加到.NET 4.0中,以帮助程序员执行您的操作,捕获所有使用catch (Exception)
异常处理catch (Exception)
。 然后让程序继续运行。 这有一个坏习惯,他们也抓住了真正讨厌的例外的诀窍,他们应该永远不会捕获,因为他们保证是不可恢复的。 常常在不知不觉中。 这导致的程序故障很难诊断,可能需要一段时间才能检测到不正常行为。
我可以推测其他SEH例外情况。 但这只是猜测。 关键是你不必知道。 任何带有[HandleProcessCorruptedStateExceptions]的方法应该是一个外部异常处理程序,在线程入口时激活。 像Main()一样。 SEH处理程序应该做的事情很少,只要让用户知道程序失败的原因并调用Environment.FailFast()即可。
因此,编写没有属性的catch (Exception)
现在没有问题,CLR会在查找处理程序时跳过它。 你不能不小心吞下那些讨厌的东西。 您的情况可能有点不同,看起来像没有明确定义的线程入口点的加载项。 将try / catch方法的主体移到另一个方法中,并忽略该方法的属性。 要被具有该属性的方法调用,现在可以安全地假定它捕获了一个令人讨厌的属性。
并且确保当它捕获时不会让VS运行。 调试器的状态被分解了,调试会话肯定结束了,试图继续使用它的程序员将不能很好地结束。 因此,显示一个消息框并快速失败或重新抛出。
链接地址: http://www.djcxy.com/p/82083.html上一篇: Detecting if an exception is a Corrupted State Exception