ChatGPT解决这个技术问题 Extra ChatGPT

应用程序因“.NET 运行时内部错误”而崩溃

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

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

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

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

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

H
Hans Passant

退出代码 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 是值得一看的文件”?
P
Peter Duniho

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

ExecutionEngineException occurs during Garbage Collection

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

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

有关使用 <gcConcurrent/> 配置元素来禁用并发或(在 .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/…
j
jason

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

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


您代码中的那些错误,它们是否也存在于纯托管代码中,或者它们总是涉及非托管代码?
C
Community

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


A
Astrogator

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

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


p
park896

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

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


您收到的 HotFix 文件的版本号是多少? KB 中列出的版本号是 4.0.30319.526,但我已经有 4.0.30319.18052。是否仍需要 HotFix 或已将其整合到 Windows 更新中?
当我运行 HotFix exe 时,我得到“KB2640103 不适用,或者被您计算机上的其他情况阻止”。
F
Filip Frącz

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


A
Arthur Smirnov

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

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

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

和以前的错误:

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


S
SiMoStro

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

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


D
DiskJunky

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

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 的期望发生了冲突。
M
Mark Gibbons

在我的情况下,问题是由于我的 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>

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


M
Maurizio Pozzobon

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

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

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

降级到 Polly v6 就足以解决它


b
bluish

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


u
user4815065

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

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

欢呼。


N
Nelson J Perez

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

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

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

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

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


É
Éric Bergeron

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

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

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


b
binki

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

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


M
Mahboob

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

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

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

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