我们有一个针对 .NET 4.0 编写的应用程序,该应用程序在周末崩溃,将以下消息放入事件日志:
应用程序:PnrRetrieverService.exe 框架版本:v4.0.30319 描述:由于 IP 791F9AAA (79140000) 的 .NET 运行时出现内部错误,退出代码为 80131506,进程已终止。
这是在 Windows Server 2003 R2 标准版框中。谷歌搜索这个错误并没有发现任何相关的东西。例如,这不是在 VS Studio 中发生的,而是在生产盒中发生的;当服务最终重新启动时,它没有遇到进一步的问题。
如何诊断 .NET 运行时中的错误?
退出代码 80131506
这是一个讨厌的,ExecutionEngineException。从 .NET 4.0 开始,此异常会立即终止程序。一般原因是垃圾收集堆的状态损坏。这反过来总是由非托管代码引起的。引发此异常的代码中的确切位置没有帮助,损坏通常发生在检测到损坏之前。
找到造成这种情况的确切原因将很困难。查看您的服务可能正在使用的任何非托管代码。如果没有明显的候选者,就会怀疑环境问题,行为不端的恶意软件扫描程序是臭名昭著的。如果它重复得很差,那么怀疑硬件问题,如软 RAM 错误。
x64 .Net 4 上垃圾收集的并发实现中的错误可能会导致此问题,如以下 microsoft KB 条目中所述:
ExecutionEngineException occurs during Garbage Collection
您应该首先进行深入的小型转储探索,以确保问题发生在垃圾收集期间。
小型转储位置通常可以在崩溃条目之后的事件日志中的 Windows 错误报告条目中找到。然后,享受 WinDbg 的乐趣吧!
有关使用 <gcConcurrent/>
配置元素来禁用并发或(在 .NET 4 及更高版本中)后台垃圾收集的最新文档,可以在 here 中找到。
我在 .NET 运行时中遇到了“内部错误”,结果证明这是由我的代码中的错误引起的;不要仅仅因为它是 .NET 运行时中的“内部错误”就认为代码中没有错误是根本原因。在你责怪别人的代码之前,总是总是责怪你自己的代码。
希望您有日志记录和异常/堆栈跟踪信息来指示您从哪里开始查找,或者您可以重复崩溃前的系统状态。
对于那些从谷歌来到这里的人,我最终遇到了 this SO question,并且 this specific answer 解决了我的问题。我已通过 support.microsoft.com 上的实时聊天联系 Microsoft 以获取修补程序,他们通过电子邮件向我发送了修补程序的链接。
在我的 .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
根本原因仍然未知(机器没有更新并且几乎没有用处),但它为我做到了!
经过多年在许多应用程序中解决这个问题后,微软似乎终于接受了它作为 .NET 4 CLR 中的一个错误,导致这种情况发生。 http://support.microsoft.com/kb/2640103。
我之前一直在通过强制垃圾收集器在服务器模式下运行(app.config 中的 gcServer enabled="true")来“修复”它,如 Think Before Coding 链接到的 Microsoft 文章中所述。这实质上会强制应用程序中的所有线程在收集期间暂停,从而消除其他线程访问被 GC 操作的内存的可能性。我很高兴地发现,我多年来在我的代码或其他 3rd 方非托管库中徒劳地寻找“错误”只是徒劳无功,因为错误存在于 Microsoft 的代码中,而不是我的代码中。
在我的情况下,当磁盘空间用完并且 .NET 无法在 Windows 虚拟内存中分配内存时发生此异常。
在事件日志中我看到了这个错误:
应用程序弹出窗口:Windows - Virtual Memory Minimum Too Low:您的系统虚拟内存不足。 Windows 正在增加您的虚拟内存分页文件的大小。在此过程中,可能会拒绝某些应用程序的内存请求。
和以前的错误:
C: 磁盘已达到或接近容量。您可能需要删除一些文件。
就我而言,问题是一个 C++/CLI 库,其中调用了 NtQuerySystemInformation;有时出于某种原因(在神秘的情况下),当它被调用时,CLR 堆损坏并且应用程序崩溃。
我已经使用用 HeapCreate 创建的“自定义堆”解决了这个问题,并在那里分配了该函数使用的缓冲区。
我不确定它是否对每个人都有帮助,但我可以通过运行来解决这个问题
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:
在我的情况下,问题是由于我的 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>
删除所有重复项解决了这个问题。
在我的情况下,问题与“在经典 asp.net 项目中引用 .NET 标准库”和这两个问题有关
https://github.com/dotnet/standard/issues/873
https://github.com/App-vNext/Polly/issues/628
降级到 Polly v6 就足以解决它
在我的情况下,登录 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 并解决了这个问题。
框架版本:v4.0.30319 描述:进程因未处理的异常而终止。异常信息:System.Reflection.TargetInvocationException
我遇到了这个错误,应用程序在某些 PC 上运行良好,在某些 PC 上出现上述错误。我卸载了 Framework 4.5 并重新安装,这解决了我的问题。
欢呼。
这可能是终结器中发生的异常。如果您正在执行 ~Class(){ Dispose(false); 的模式} 检查你将什么作为非托管资源处理。试一试……抓住那里,你应该没问题。
我们发现了这个问题,因为我们遇到了这个没有日志的神秘故障我们做了通常推荐的使用“void Dispose(bool disposing)”的模式。
查看有关终结器的这个问题的答案,我们发现了非托管资源的处置可能引发异常的地方。
事实证明,我们没有正确处置对象,因此终结器接管了非托管资源的处置,因此发生了异常。
在这种情况下,使用 Kafka Rest API 从 Kafka 中清理客户端。似乎它确实在某个时候引发了异常,然后发生了这个问题。
每隔 5 到 10 分钟,我的应用程序池就会因为这个退出代码而崩溃。我不想破坏您对垃圾收集器的信任,但以下解决方案对我有用。
我添加了一个每分钟调用 GC.GetTotalMemory(true)
的作业。
我想,出于某种原因,对于我使用的大量一次性对象,GC 不会经常自动检查内存。
我从来不明白为什么这会发生在我身上。对于我的一个应用程序,它始终可以重现,但在简单地重新启动后就消失了。
我正在使用 .net-4.8 运行 Windows 2004 Build 19582.1001(Insider Preview),如果这是由于硬件内存错误之类的原因,我也不会感到惊讶。此外,我的应用程序确实加载了一些非托管代码并对其进行了初始化,因此我无法证明崩溃不是来自于此。
在安装 SQL Server 2017 时,我在 Windows 2016 上遇到了同样的问题。错误是
“ScenarioEngine.exe 因“.NET 运行时内部错误”而崩溃
首先检查 Microsoft .NET Framework 版本是否为 4.5,然后升级到最新版本。目前它是 Microsoft .NET Framework 4.8。如果这对您不起作用,请尝试下一步。
下一步:请卸载 KB4486129,然后下载 Microsoft .NET Framework 4.8。同样的错误已为我解决。
不定期副业成功案例分享