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

本文关键字:NET 错误 内部 GC 并发 运行时 80131506 | 更新日期: 2023-09-27 18:33:54

我有一个长时间运行的 .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    

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

  • 我尝试安装此修补程序,但它不会安装在我的任何计算机上 (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>
    

虽然奇怪的是我仍然在进程转储中找到多个与 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    

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

我认为这总结了我迄今为止设法找到的内容。我真的可以在如何处理这个问题方面获得一些帮助。

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

我是根据我过去在我们的应用程序中的经验得出的。如果异常在终结器级别之前未处理,并且如果异常发生...它将使应用程序崩溃。

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

一个快速检查...您是否正在使用任务并行库如果是,请确保您正确处理异常。如果来自不同线程的异常未处理,它会一直到终结器,然后导致应用程序崩溃。有几种方法可以巧妙地处理它们。处理"聚合"异常是一种方法(我们曾经解决过!

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

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

我意识到这是一个旧帖子,但是,我遇到了与 OP 相同的问题。 阿特拉斯特提出的观点是:

将运行时更改为 x86 或 x64,然后重试;您也可以像已经尝试过的那样弄乱并发 GC 设置。

是我的关键。 我的所有项目都设置为"任何CPU",除了一个(巧合的是,该应用程序的入口点是控制台应用程序项目(。 此项目设置为 x86。 一旦我将其更改为任何CPU,应用程序就可以正常运行。

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

我添加了一个调用 GC 的作业。GetTotalMemory(true( 每分钟一次。我假设,由于某种原因,GC 不会经常自动调用垃圾收集器,以满足我使用的大量一次性对象。但这解决了我的问题!这更像是一个快速修复,而不是最终的解决方案 ;)<</p>

div class="answers">

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

我刚刚结束了与Microsoft的对话,因为我已经能够重现一个类似的问题。

就我而言,这是 .NET 运行时中的一个错误,这与混合动态类型和非动态代码有关。我不确定在您的场景中是否也是如此,但您可能想尝试一些方法:

  • 在 Windows 8.1(最新更新(上运行代码。显然,Windows 8.1比其他版本的Windows具有更新的.NET版本。
  • 如果您使用 AssemblyBuilder(就像我一样(,请尝试将其更改为Run模式而不是 RunAndCollect
  • 将运行时更改为 x86 或 x64,然后重试;您也可以像已经尝试过的那样弄乱并发 GC 设置。
  • 在我们说话的时候,我的错误正在修复,这基本上意味着会有一个 Windows 更新来处理它。也许这只是一种选择,可以简单地等待;我预计这不会花费太长时间,因为它对许多程序都非常关键。

我终于找到了可以安装的修复程序。我也有 4.5 并且没有安装 4.0 的其他修复程序。删除 4.5 也没有修复它。链接中的修复实际上修复了它。

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

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