标签: corrupted-state-exception

优雅地处理损坏的状态异常

此问题相关,我想强制CLR让我的.NET 4.5.2应用程序捕获损坏的状态异常,其唯一目的是记录它们然后终止应用程序.如果我catch (Exception ex)在应用程序周围的几个地方,这样做的正确方法是什么?

因此,在我指定<legacyCorruptedStateExceptionsPolicy>属性后,如果我理解正确,所有catch (Exception ex)处理程序将捕获异常,AccessViolationException并愉快地继续.

是的,我知道catch (Exception ex)是一个坏主意™,但如果CLR至少将正确的堆栈跟踪放入事件日志中,我将非常乐意向客户解释他的服务器应用程序在凌晨1点快速失败并且离线晚上是件好事.但不幸的是,CLR将一个不相关的异常记录到事件日志中,然后关闭该过程,以便我无法找出实际发生的情况.

问题是,如何实现这一目标,流程广泛:

if the exception thrown is a Corrupted State Exception:
    - write the message to the log file
    - end the process 
Run Code Online (Sandbox Code Playgroud)

(更新)

换句话说,这可能适用于简单应用中的大多数例外:

[HandleProcessCorruptedStateExceptions] 
[SecurityCritical]
static void Main() // main entry point
{
    try 
    {

    }
    catch (Exception ex)
    {
        // this will catch CSEs
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,它不适用于:

  • 未处理的应用程序域异常(即在非前台线程上抛出)
  • Windows服务应用程序(没有实际Main入口点)

所以这似乎<legacyCorruptedStateExceptionsPolicy>是使这项工作成功的唯一方法,在这种情况下,我不知道在记录CSE后如何失败?

.net c# access-violation fail-fast corrupted-state-exception

23
推荐指数
2
解决办法
6837
查看次数

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

我有一些调用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
     }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法检测例外是否是General Catch中的CSE?

我看到一个kludge,他们有2个一般的例外条款.内部的不处理CSE并设置标志.如果在没有旗帜的情况下调用外部,那么它就是CSE,但我希望能有更清洁的东西.我想做的是记录这个糟糕的状态,然后将它传递给应用程序以正常冒泡.

当我查看事件日志中导致VS2013失败的错误时,我得到了这个:

应用程序:devenv.exe Framework版本:v4.0.30319描述:由于未处理的异常,进程已终止.异常信息:异常代码0000005,异常地址4DA44C1F堆栈:在Microsoft.VisualStudio.Debugger.Clr.NativeDkmClrModuleInstance.ProcF4BC786AEBAC294EE9C4C0BB1B0F56A7(IntPtr的,IntPtr的为ByRef)在Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance.GetMetaDataImport()在Microsoft.IntelliTrace.Concord Microsoft.IntelliTrace.Concord.Integration.CpdeNotifyPointServiceAdapter.InstallBreakpoint中的.MetadataHelper..ctor(Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance)(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.NotifyPointManager.OnModuleInstanceLoad(Microsoft.VisualStudio.Deb Microsoft.VisualStudio.Debugger.EntryPoint.IDkmModuleInstanceLoadNotification_OnModuleInstanceLoad(IntPtr,IntPtr,IntPtr,IntPtr)中的ugger.DkmModuleInstance,Microsoft.VisualStudio.Debugger.DkmWorkList,Microsoft.VisualStudio.Debugger.DkmEventDescriptorS)

接下来是这样的:

错误应用程序名称: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

c# exception corrupted-state-exception visual-studio-2013

7
推荐指数
1
解决办法
1057
查看次数

不同的AppDomain损坏的状态异常(AccessViolationException)应用程序池工作进程

在.NET 4.6中的AppDomain中抛出AccessViolationException(或其他损坏状态异常)时,如何防止整个应用程序(进程)崩溃?我的目标是在其AppDomain中包装第三方库(GdPicture.NET条形码阅读器),根据IIS崩溃转储间歇性地崩溃IIS工作进程.换句话说,我想在自己的应用程序域中隔离第三方库调用,这样它就可以在不占用整个网站的情况下自行失败.

在下面的示例代码中,如果我不使用HandleProcessCorruptedStateExceptions属性,则无法捕获在另一个AppDomain(在ClassLibrary1.dll中)中引发的AccessViolationException(包装在TargetInvocationException中).如果我装饰HandleProcessCorruptedStateExceptions(仅用于第二个AppDomain调用),主进程是否可以继续安全或是否变为不稳定状态?

具有两个项目的Visual Studio解决方案(控制台应用程序和类库).

在此输入图像描述

using System;
using System.Reflection;
using System.Runtime.ExceptionServices;
using System.Security;

namespace StackOverflowQuestion
{
    class Program
    {
        static void Main(string[] args)
        {
            new Tester().RunTest();
        }
    }

    class Tester
    {
        public void RunTest()
        {
            var myTestAppDomain = AppDomain.CreateDomain("My Test AppDomain");
            var loader = (Loader)myTestAppDomain.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName);
            TestHandleProcessCorruptedStateExceptions(loader, myTestAppDomain);

            // how can I make sure process doesn't crash when AppDomain "My Test AppDomain" crashes
            Console.WriteLine("This won't be written to console unless [HandleProcessCorruptedStateExceptions] attribute is present...");

            // keep console window open
            Console.ReadKey(); …
Run Code Online (Sandbox Code Playgroud)

c# worker-process appdomain access-violation corrupted-state-exception

5
推荐指数
0
解决办法
135
查看次数