关于c#:. NET 4.5:.NET运行时内部错误(80131506)/禁用并发GC

.NET 4.5: internal error in the .NET Runtime (80131506) / disabling concurrent GC

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

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

1
2
3
4
5
6
7
8
9
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

此问题与此处讨论的问题非常相似,因此我尝试了该主题中建议的解决方案,但没有一个帮助您:

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

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

    1
    2
    3
    4
    5
    6
    7
    <?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>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

这让我想知道是否可以以某种方式禁用并发GC(这实际上是我列出的配置)。

我认为这总结了到目前为止我已经找到的东西。对于如何继续处理此问题,我真的可以使用一些帮助。


我是从过去的应用经验中汲取经验的。如果在Finalizer级别之前未处理异常,则可能导致这种情况,如果异常发生,它将使应用程序崩溃。

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

快速检查...您是否正在使用任务并行库?如果是,请确保您正在正确处理异常。如果未处理来自不同线程的异常,它将处理到Finalizer,这将使应用程序崩溃。有两种方法可以巧妙地处理它们。处理"聚合"异常是一种方法(我们曾经解决过!)。

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

我没有50分可以添加评论,因此将其添加为答案...


我意识到这是一个旧帖子,但是,我遇到了与OP相同的问题。强调的要点是:

Change the runtime to x86 or x64 and try again; you can also mess with the concurrent GC settings like you already tried.

对我来说是关键。我的所有项目都设置为"除一个以外的CPU"(巧合的是,作为控制台应用程序项目的应用程序的入口点)。该项目设置为x86。将其更改为"任何CPU"后,应用程序即可正常运行。


我的问题是每5-10分钟我的应用程序池因退出代码(80131506)而崩溃,这很奇怪。我不确定在高线程操作/计划任务中您应该推动垃圾收集器,但是以下解决方案在这里起作用。

我添加了一个每分钟调用GC.GetTotalMemory(true)的Job。我认为,由于某种原因,GC不会足够频繁地自动调用垃圾收集器来处理我使用的大量一次性对象。但这解决了我的问题!它更像是一种快速解决方案,而不是最终的解决方案;)


.NET 4.5桌面应用程序-Web scraper中遇到了同样的问题。它在重负载下随机坠毁。因此,几个月来我们一直在寻找找出原因的方法:我们已经尝试了一切!禁用并发GC,将其设置为Server模式以及许多其他解决方法,直到我们意识到崩溃是由于PhantomJS模块引起的。它使用了一些非托管资源,以后不会清除它们:(因此,我们为PhantomJS集成创建了一个独立的控制台应用程序。现在我们从Web抓取工具中使用Process.Start执行该控制台应用程序,然后将其杀死。有更多时间进行抓取,但不再有崩溃!


我终于找到了可以安装的修复程序。我也有4.5和未安装4.0的其他修复程序。删除4.5也无法解决。在链接中实际修复它已修复。

http://kb.machsol.com/Knowledgebase/Article/50305


由于能够重现类似的问题,所以我刚刚完成了与Microsoft的对话。

就我而言,这是.NET运行时中的错误,与混合动态类型和非动态代码有关。我不确定您的情况是否也是这种情况,但是您可能需要尝试以下操作:

  • 在Windows 8.1(最新更新)上运行代码。显然Windows 8.1具有比其他Windows版本更高的.NET版本。
  • 如果您像我一样使用AssemblyBuilder,请尝试将其更改为Run模式而不是RunAndCollect
  • 将运行时更改为x86或x64,然后重试。您还可以像尝试过的那样处理并发GC设置。
  • 正如我们所说的,我的错误已得到修复,这基本上意味着将有一个Windows更新来解决该问题。也许只是等待它也是一种选择。我不希望花费太长时间,因为对于许多程序而言,这非常关键。

帮助我的解决方案:卸载.NET 4.5.1,安装4.0,安装提到的修补程序,再安装4.5.1。