.NET 4.5:.NET运行时中的内部错误(80131506)/禁用并发GC

Hel*_*ick 22 .net c# clr garbage-collection .net-4.5

我有一个长期运行的.NET 4.5应用程序随机崩溃,留下我在事件日志中的问题标题中提到的消息.该问题在3种不同的机器和2种不同的系统上重现(2008 R2和2012).应用程序不使用任何不安全/非托管组件,它是纯托管.NET,唯一不受管理的东西是CLR本身.

这是我从转储中提取的崩溃站点的堆栈跟踪:

clr.dll!MethodTable::GetCanonicalMethodTable()  
clr.dll!SVR::CFinalize::ScanForFinalization()  - 0x1a31b bytes  
clr.dll!SVR::gc_heap::mark_phase()  + 0x328 bytes   
clr.dll!SVR::gc_heap::gc1()  + 0x95 bytes   
clr.dll!SVR::gc_heap::garbage_collect()  + 0x16e bytes  
clr.dll!SVR::gc_heap::gc_thread_function()  + 0x3e bytes    
clr.dll!SVR::gc_heap::gc_thread_stub()  + 0x77 bytes    
kernel32.dll!BaseThreadInitThunk()  + 0x1a bytes    
ntdll.dll!RtlUserThreadStart()  + 0x21 bytes    
Run Code Online (Sandbox Code Playgroud)

这个问题与这里讨论的问题非常相似,所以我尝试了该主题中提出的解决方案,但没有一个帮助:

  • 我已经尝试安装修补程序,但它不会安装在我的任何机器上(KB2640103不适用,或被计算机上的其他条件阻止),这实际上是有道理的,因为我使用的是4.5,而不是4.0 .

  • 我已经尝试禁用并发GC和/或启用服务器GC.现在我的app.config的相关部分如下所示:

    <?xml version="1.0"?>
    <configuration>        
        <runtime>
            <gcConcurrent enabled="false"/>
            <gcServer enabled="true" />
        </runtime>
    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>    </startup></configuration>
    
    Run Code Online (Sandbox Code Playgroud)

虽然奇怪的是我仍然在进程转储中找到多个与GC相关的线程.除了发生崩溃之外,还有7个线程具有以下堆栈跟踪:

ntdll.dll!NtWaitForSingleObject()  + 0xa bytes  
KERNELBASE.dll!WaitForSingleObjectEx()  + 0x9a bytes    
clr.dll!CLREventBase::WaitEx()  + 0x13f bytes   
clr.dll!CLREventBase::WaitEx()  + 0xf7 bytes    
clr.dll!CLREventBase::WaitEx()  + 0x78 bytes    
clr.dll!SVR::t_join::join()  + 0xd8 bytes   
clr.dll!SVR::gc_heap::scan_dependent_handles()  + 0x65 bytes    
clr.dll!SVR::gc_heap::mark_phase()  + 0x347 bytes   
clr.dll!SVR::gc_heap::gc1()  + 0x95 bytes   
clr.dll!SVR::gc_heap::garbage_collect()  + 0x16e bytes  
clr.dll!SVR::gc_heap::gc_thread_function()  + 0x3e bytes    
clr.dll!SVR::gc_heap::gc_thread_stub()  + 0x77 bytes    
kernel32.dll!BaseThreadInitThunk()  + 0x1a bytes    
ntdll.dll!RtlUserThreadStart()  + 0x21 bytes    
Run Code Online (Sandbox Code Playgroud)

这让我想知道我是否能以某种方式搞砸禁用并发GC(这就是我实际列出的配置).

我认为这包含了我迄今为止找到的内容.我真的可以使用一些帮助来处理这个问题.

Sri*_*kat 5

我从我过去在申请中的经验中汲取经验.如果异常未处理到Finalizer级别,可能会导致这种情况,如果它发生了......它将使应用程序崩溃.

在对GC配置进行任何操作之前..

快速检查一下...... 您使用的是任务并行库吗?如果是,请确保正确处理异常.如果来自不同线程的异常未处理,则直到Finalizer然后崩溃应用程序.有几种方法可以整齐地处理它们.处理'聚合'异常是一种方式(我们过去常常解决!).

http://msdn.microsoft.com/en-us/library/dd537614.aspx

我没有50分添加评论,所以添加它作为答案...