【问题标题】:Application Crashes With "Internal Error In The .NET Runtime"应用程序因“.NET 运行时内部错误”而崩溃
【发布时间】:2011-05-21 00:58:14
【问题描述】:

我们有一个针对 .NET 4.0 编写的应用程序,该应用程序在周末崩溃,将以下消息放入事件日志:

应用程序:PnrRetrieverService.exe 框架版本:v4.0.30319
说明:进程因内部错误而终止 IP 791F9AAA (79140000) 的 .NET 运行时,退出代码为 80131506。

这是在 Windows Server 2003 R2 标准版盒子上。谷歌搜索这个错误并没有发现任何相关的东西。例如,这不是在 VS Studio 中发生的,而是在生产盒中发生的;当服务最终重新启动时,它没有遇到进一步的问题。

如何诊断 .NET 运行时中的错误?

【问题讨论】:

  • 如果这是第一次发生此错误,那么我会调查过去几天到一周内发生的任何变化。

标签: .net runtime-error executionengineexception


【解决方案1】:

在安装 SQL Server 2017 时,我在 Windows 2016 上遇到了同样的问题。错误是

“ScenarioEngine.exe 因“.NET 运行时出现内部错误”而崩溃

首先检查 Microsoft .NET Framework 版本是否为 4.5,然后升级到最新版本。目前它是 Microsoft .NET Framework 4.8。如果这对您不起作用,请尝试下一步。

下一步:请卸载 KB4486129,然后下载 Microsoft .NET Framework 4.8。同样的错误已为我解决。

【讨论】:

    【解决方案2】:

    我一直不明白为什么会发生这种情况。对于我的一个应用程序,它始终可以重现,但在简单地重新启动后就消失了。

    我正在运行带有 .net-4.8 的 Windows 2004 Build 19582.1001(Insider Preview),如果这是由于硬件内存错误之类的原因,我也不会感到惊讶。此外,我的应用程序确实加载了一些非托管代码并对其进行了初始化,因此我无法证明崩溃不是由此造成的。

    【讨论】:

      【解决方案3】:

      在我的情况下,问题与“在经典 asp.net 项目中引用 .NET 标准库”以及这两个问题有关

      https://github.com/dotnet/standard/issues/873

      https://github.com/App-vNext/Polly/issues/628

      降级到 Polly v6 就足以解决它

      【讨论】:

        【解决方案4】:

        在我的情况下,问题是由于我的 web.config 中的重复绑定重定向造成的。更多信息here

        我认为这是因为 NuGet 修改了绑定重定向,但例如它看起来像这样:

          <dependentAssembly>
            <assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181"/>
            <bindingRedirect oldVersion="0.0.0.0-2.9.4.0" newVersion="3.0.3.0"/>
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
            <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0"/>
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181"/>
            <bindingRedirect oldVersion="0.0.0.0-2.9.4.0" newVersion="3.0.3.0"/>
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
            <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0"/>
          </dependentAssembly>
        

        删除所有重复项解决了问题。

        【讨论】:

          【解决方案5】:

          我的 .NET 4 代码的最新版本在 WinXP 机器上出现了同样的错误。检查以前的版本 - 现在它们也崩溃了!好的,所以不是我 :)。此处/以上没有任何建议。

          关于同一问题的更多最新 (2018-05-09) 报告:Application Crash with exit code 80131506

          :我们收到了类似的错误,但我们认为这是由 Citrix 内存优化器引起的。
          解决方案是强制在出现问题的主机上重新生成 .Net 核心库:
          C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe update /force

          根本原因仍然未知(机器未更新且几乎没有用处),但为我做到了

          【讨论】:

            【解决方案6】:

            每隔 5 到 10 分钟,我的应用程序池就会因此退出代码而崩溃。我不想破坏您对垃圾收集器的信任,但以下解决方案对我有用。

            我添加了一个每分钟调用GC.GetTotalMemory(true) 的作业。

            我想,出于某种原因,GC 不会经常自动检查内存,以应对我使用的大量一次性对象。

            【讨论】:

              【解决方案7】:

              我不确定它是否对每个人都有帮助,但我可以通过运行来解决这个问题

              devenv.exe /ResetSettings 
              

              ...在路径{Visual_Studio_root}\Common7\Ide

              我在事件日志中有以下错误,而 VS 一直在崩溃并重新启动:

              Faulting application name: devenv.exe, version: 14.0.25123.0, time stamp: 0x56f22f32
              Faulting module name: clr.dll, version: 4.7.2115.0, time stamp: 0x59af88f2
              Exception code: 0xc0000005
              Fault offset: 0x0015f90e
              Faulting process id: 0x3a7c
              Faulting application start time: 0x01d353463eaf0c36
              Faulting application path: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe
              Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
              Report Id: a232f984-6e80-4f61-9003-e18a035c8f93
              Faulting package full name: 
              Faulting package-relative application ID: 
              

              【讨论】:

              • 这对我也有用。背景:我已经将一个中型解决方案(约 25 个项目)转换为 .NET Core SDK,前面是一个几乎空的 Web 应用程序项目,该项目在转换之前替换了旧的 WAP。显然,一些挥之不去的设置与新项目中 IISExpress 的预期相冲突。
              【解决方案8】:

              x64 .Net 4 上垃圾收集的并发实现中的错误可能导致此问题,如以下 microsoft KB 条目所述:

              ExecutionEngineException occurs during Garbage Collection

              您应该首先进行深入的小型转储探索,以确保问题发生在垃圾收集期间。

              小型转储位置通常可以在崩溃条目之后的事件日志中的 Windows 错误报告条目中找到。 那么,尽情享受 WinDbg 吧!

              有关使用 &lt;gcConcurrent/&gt; 配置元素来禁用并发或(在 .NET 4 及更高版本中)后台垃圾收集的最新文档,可以在 here 找到。

              【讨论】:

              • 感谢您的评论 - 这是我长期以来遇到的问题的解决方案!
              • 你是救生员,这是我们的问题。顺便说一句,您还可以在 Visual Studio 中打开 minidump 文件,根据需要设置符号路径,然后进行调试。这告诉我们错误发生在 clr.dll!WKS::gc_heap::mark_object_simple()。我确信 WinDbg 非常强大,但是如果您只是在验证错误的来源,使用 VS 可以告诉您足够多的信息。
              • 应用程序崩溃了,但我在 C:\Temp\CrashDump 文件夹中没有找到任何迷你转储。那里还有其他一些崩溃转储,我们可以从几天前的崩溃中找到这些转储。你知道为什么没有崩溃转储吗?错误信息和退出代码完全一样。
              • 这正是我要找的......应用程序崩溃事件包含一个指令指针,如果没有转储,这对我来说毫无用处。从没想过要寻找以后的事件。谢谢!
              • 对于处于相同情况的其他人,配置 Windows 错误报告以在崩溃时执行完整的堆转储可能很有用:msdn.microsoft.com/en-us/library/windows/desktop/…
              【解决方案9】:

              这可能是终结器中发生的异常。如果您正在执行 ~Class(){ Dispose(false); 的模式} 检查你将什么作为非托管资源处理。 只要尝试一下..catch 就可以了。

              我们发现了这个问题,因为我们遇到了这个没有日志的神秘故障 我们采用了通常推荐的模式,即使用“void Dispose(bool disposing)”。

              查看有关终结器的这个问题的答案,我们发现非托管资源的处置可能会引发异常。

              事实证明,我们没有正确处置对象,因此终结器接管了非托管资源的处置,因此发生了异常。

              在这种情况下,使用 Kafka Rest API 从 Kafka 中清理客户端。似乎它确实在某个时候引发了异常,然后发生了这个问题。

              【讨论】:

                【解决方案10】:

                框架版本:v4.0.30319 说明:进程因未处理的异常而终止。 异常信息:System.Reflection.TargetInvocationException

                我遇到了这个错误,应用程序在某些 PC 上运行良好,在某些 PC 上出现上述错误。我卸载了 Framework 4.5 并重新安装,这解决了我的问题。

                欢呼。

                【讨论】:

                  【解决方案11】:

                  在我的情况下,登录 SAP Business One 9.1 应用程序时发生此错误。在 Windows 事件中,除了 OP 报告的错误事件之外,我还可以找到另一个错误事件:

                  Nome dell'applicazione che ha generato l'errore: SAP Business One.exe, versione: 9.10.160.0, timestamp: 0x551ad316
                  Nome del modulo che ha generato l'errore: clr.dll, versione: 4.0.30319.34014, timestamp: 0x52e0b784
                  Codice eccezione: 0xc0000005
                  Offset errore 0x00029f55
                  ID processo che ha generato l'errore: 0x1d7c
                  Ora di avvio dell'applicazione che ha generato l'errore: 0x01d0e6f4fa626e78
                  Percorso dell'applicazione che ha generato l'errore: C:\Program Files (x86)\SAP\SAP Business One\SAP Business One.exe
                  Percorso del modulo che ha generato l'errore: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
                  ID segnalazione: 3fd8e0e7-52e8-11e5-827f-74d435a9d02c
                  Nome completo pacchetto che ha generato l'errore: 
                  ID applicazione relativo al pacchetto che ha generato l'errore: 
                  

                  该机器运行 Windows 8.1,安装了 .NET Framework 4.0,但未安装 4.5 版本。从互联网上看,这也可能是 .NET 4 中的一个错误,我尝试安装 .NET Framework 4.5.2 并解决了这个问题。

                  【讨论】:

                    【解决方案12】:

                    在我的情况下,问题是一个 C++/CLI 库,其中调用了 NtQuerySystemInformation;有时出于某种原因(并且在神秘的情况下),当它被调用时,CLR 堆损坏并且应用程序崩溃。

                    我使用HeapCreate 创建的“自定义堆”解决了这个问题,并在那里分配了该函数使用的缓冲区。

                    【讨论】:

                      【解决方案13】:

                      经过多年在许多应用程序中解决此问题后,似乎 Microsoft 终于接受了它作为 .NET 4 CLR 中的一个错误导致这种情况发生。 http://support.microsoft.com/kb/2640103.

                      我之前一直在“修复”它,方法是强制垃圾收集器在服务器模式下运行(app.config 中的 gcServer enabled="true"),如 Think Before Coding 链接到的 Microsoft 文章中所述。这实质上会强制应用程序中的所有线程在收集期间暂停,从而消除其他线程访问被 GC 操作的内存的可能性。我很高兴地发现,多年来在我的代码或其他第 3 方非托管库中寻找“错误”但徒劳无功,因为错误存在于 Microsoft 的代码中,而不是我的代码中。

                      【讨论】:

                      • 您收到的 HotFix 文件的版本号是多少? KB 中列出的版本号是 4.0.30319.526,但我已经有 4.0.30319.18052。是否仍需要 HotFix 或已将其整合到 Windows 更新中?
                      • 当我运行 HotFix exe 时,我得到“KB2640103 不适用,或被您计算机上的其他条件阻止。”
                      【解决方案14】:

                      对于那些从谷歌来到这里的人,我最终遇到了this SO questionthis specific answer 解决了我的问题。我已通过support.microsoft.com 上的实时聊天联系 Microsoft 以获取修补程序,他们通过电子邮件向我发送了修补程序的链接。

                      【讨论】:

                        【解决方案15】:

                        可能是并发 GC 的错误 http://support.microsoft.com/kb/2679415

                        【讨论】:

                          【解决方案16】:

                          在我的情况下,当磁盘空间用完并且 .NET 无法在 Windows 虚拟内存中分配内存时发生此异常。

                          在事件日志中我看到了这个错误:

                          应用程序弹出窗口:Windows - Virtual Memory Minimum Too Low:您的系统虚拟内存不足。 Windows 正在增加您的虚拟内存分页文件的大小。在此过程中,可能会拒绝某些应用程序的内存请求。

                          还有之前的错误:

                          C: 磁盘已达到或接近容量。您可能需要删除一些文件。

                          【讨论】:

                            【解决方案17】:

                            退出代码为 80131506

                            这是一个令人讨厌的问题,ExecutionEngineException。从 .NET 4.0 开始,此异常会立即终止程序。一般原因是垃圾收集堆的状态损坏。这反过来总是由非托管代码引起的。代码中引发此异常的确切位置没有帮助,损坏通常发生在检测到损坏之前。

                            很难找到造成这种情况的确切原因。查看您的服务可能正在使用的任何非托管代码。如果没有明显的候选者,就会怀疑环境问题,行为不端的恶意软件扫描程序是臭名昭著的。如果它的重复性很差,则怀疑是硬件问题,例如软 RAM 错误。

                            【讨论】:

                            • 我遇到了problems with SQL CE 3.5 损坏堆,导致 ntdll.dll 和 .NET 运行时错误中的异常。
                            • SDK 头文件 CorError.h 中列出了它们
                            • 你怎么知道它们被列在 CorError.h 中??
                            • 使用这个 Err.exe 工具microsoft.com/en-au/download/details.aspx?id=985 计算出 80131506 等十六进制错误代码的含义以及包含它们的头文件。
                            • @HansPassant 我想的问题是'在世界上存在的所有文件中,你怎么知道 CorError.h 是一个值得一看的文件'?
                            【解决方案18】:

                            我在 .NET 运行时中遇到了“内部错误”,结果证明这是由我的代码中的错误引起的;不要仅仅因为它是 .NET 运行时中的“内部错误”就认为代码中没有错误是根本原因。在责备别人的代码之前,总是总是责备自己的代码。

                            希望您有日志记录和异常/堆栈跟踪信息来指出从哪里开始查找,或者您可以重复崩溃前的系统状态。

                            【讨论】:

                              猜你喜欢
                              • 2014-04-02
                              • 2013-08-12
                              • 1970-01-01
                              • 1970-01-01
                              • 2019-02-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多