121

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

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

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

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

4

18 回答 18

132

退出代码 80131506

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

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

于 2010-12-06T15:20:20.783 回答
42

A bug in the concurrent implementation of the Garbage Collection on x64 .Net 4 can cause this as stated in the following microsoft KB entry:

ExecutionEngineException occurs during Garbage Collection

You should first make a deep minidump exploration to be sure that the problem occured during a Garbage collection.

The minidump location can usually be found in a Windows Error Reporting entry in the event log following the crash entry. Then, have fun with WinDbg !

The latest documentation on the use of the <gcConcurrent/> configuration element, to disable concurrent or (in .NET 4 and later) background garbage collection, can be found here.

于 2012-04-13T12:42:20.163 回答
9

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

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

于 2010-12-06T15:06:21.003 回答
7

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

于 2013-01-09T16:04:12.667 回答
6

在我的 .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

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

于 2018-11-20T20:54:21.990 回答
5

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

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

于 2013-09-03T14:48:59.513 回答
4

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

于 2012-11-28T14:49:02.817 回答
2

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

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

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

和以前的错误:

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

于 2012-08-07T11:02:45.957 回答
1

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

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

于 2015-03-11T08:42:12.953 回答
1

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

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: 
于 2017-11-01T19:30:16.147 回答
1

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

我认为这是因为 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>

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

于 2019-03-21T03:32:41.213 回答
1

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

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

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

降级到 Polly v6 就足以解决它

于 2019-04-24T08:42:33.773 回答
0

在我的情况下,登录 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并解决了这个问题。

于 2015-09-04T13:00:31.813 回答
0

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

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

于 2020-03-18T13:02:51.507 回答
0

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

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

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

于 2018-08-23T17:15:50.550 回答
0

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

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

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

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

于 2022-02-02T19:58:24.660 回答
0

这可能是终结器中发生的异常。如果您正在执行 ~Class(){ Dispose(false); 的模式 } 检查你将什么作为非托管资源处理。试一试……抓住那里,你应该没问题。

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

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

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

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

于 2017-04-17T18:06:42.343 回答
0

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

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

欢呼。

于 2016-03-22T07:58:51.900 回答