Anwendungsabstürze mit "Interner Fehler in der .NET-Laufzeit"

112

Wir haben eine Anwendung gegen .NET 4.0 geschrieben, die am Wochenende abgestürzt ist und die folgende Meldung in das Ereignisprotokoll aufgenommen hat:

Anwendung: PnrRetrieverService.exe Framework Version: v4.0.30319
Beschreibung: Der Prozess wurde aufgrund eines internen Fehlers in der .NET-Laufzeit unter IP 791F9AAA (79140000) mit dem Exit-Code 80131506 beendet.

Dies ist auf einer Windows Server 2003 R2 Standard Edition-Box. Das Googeln dieses Fehlers hat nichts Relevantes ergeben. Dies tritt beispielsweise nicht in VS Studio auf, sondern auf einer Produktionsbox. Als der Dienst schließlich neu gestartet wurde, traten keine weiteren Probleme auf.

Wie geht man vor, um einen Fehler in der .NET-Laufzeit zu diagnostizieren?

ALEXintlsos
quelle
1
Wenn dies das erste Mal ist, dass dieser Fehler auftritt, würde ich alles untersuchen, was sich in den letzten Tagen bis zu einer Woche geändert hat.
Tony Abrams

Antworten:

121

mit dem Exit-Code 80131506

Das ist eine böse, ExecutionEngineException. Ab .NET 4.0 beendet diese Ausnahme das Programm sofort. Die generische Ursache ist eine Beschädigung des Status des gesammelten Müllhaufens. Was wiederum immer durch nicht verwalteten Code verursacht wird. Die genaue Position im Code, an der diese Ausnahme ausgelöst wird, ist nicht hilfreich. Die Beschädigung trat normalerweise lange vor der Erkennung des Schadens auf.

Es wird schwierig sein, die genaue Ursache dafür zu finden. Überprüfen Sie den nicht verwalteten Code, den Ihr Dienst möglicherweise verwendet. Verdacht auf Umweltprobleme, wenn es keinen offensichtlichen Kandidaten gibt, schlecht benommene Malware-Scanner sind berüchtigt. Wenn es sich sehr schlecht wiederholt, besteht der Verdacht auf Hardwareprobleme wie Soft-RAM-Fehler.

Hans Passant
quelle
3
Ich hatte Probleme mit SQL CE 3.5, das den Heap beschädigte und Ausnahmen in ntdll.dll- und .NET-Laufzeitfehlern verursachte.
Phil
4
Sie sind in der SDK-Header-Datei CorError.h
Hans Passant
2
Woher wusstest du, dass sie in CorError.h aufgeführt sind?
Yeonho
6
Verwenden Sie dieses Err.exe-Tool microsoft.com/en-au/download/details.aspx?id=985 , um herauszufinden, was Hex-Fehlercodes wie 80131506 bedeuten und welche Header-Datei sie enthält.
Jeremy Thompson
2
@HansPassant Ich denke, die beabsichtigte Frage lautete: "Von allen Dateien auf der Welt, woher wusstest du, dass CorError.h eine lohnende Datei zum Anschauen ist?"
Bacar
41

Ein Fehler in der gleichzeitigen Implementierung der Garbage Collection unter x64 .Net 4 kann dies verursachen, wie im folgenden Microsoft KB-Eintrag angegeben:

ExecutionEngineException tritt während der Garbage Collection auf

Sie sollten zuerst eine gründliche Minidump-Untersuchung durchführen, um sicherzustellen, dass das Problem während einer Garbage Collection aufgetreten ist.

Der Minidump-Speicherort befindet sich normalerweise in einem Windows-Fehlerberichteintrag im Ereignisprotokoll nach dem Absturzeintrag. Dann viel Spaß mit WinDbg!

Die neueste Dokumentation zur Verwendung des <gcConcurrent/>Konfigurationselements zum Deaktivieren der gleichzeitigen oder (in .NET 4 und höher) Hintergrund-Garbage Collection finden Sie hier .

Denken Sie vor der Codierung
quelle
danke für diesen Kommentar - das war die Lösung für ein Problem, das ich schon lange hatte!
Lenniep
1
Du bist ein Lebensretter, das war das Problem für uns. Nebenbei können Sie die Minidump-Datei auch in Visual Studio öffnen, bei Bedarf die Symbolpfade einrichten und anschließend debuggen. Dies sagte uns, dass der Fehler bei clr.dll! WKS :: gc_heap :: mark_object_simple () auftritt. Ich bin sicher, WinDbg ist sehr leistungsfähig, aber die Verwendung von VS kann Ihnen genug sagen, wenn Sie nur die Fehlerquelle überprüfen.
Tim
Die Anwendung ist abgestürzt, aber ich habe keine Mini-Dumps im Ordner C: \ Temp \ CrashDump gefunden. Es gibt dort noch einige andere Crash-Dumps, und wir können die Dumps der Crashs vor Tagen finden. Wissen Sie, warum es keine Crash-Dumps gibt? Die Fehlermeldung und der Exit-Code sind genau gleich.
Jeffrey Zhao
Genau das habe ich gesucht ... Das App-Absturzereignis enthielt einen Anweisungszeiger, der für mich ohne Dump nutzlos war. Ich hätte nie gedacht, nach späteren Ereignissen zu suchen. Danke dir!
Laindir
1
Für andere in der gleichen Situation kann es nützlich sein, die Windows- Fehlerberichterstattung
laindir
9

Ich habe "interne Fehler" in der .NET-Laufzeit festgestellt, die durch Fehler in meinem Code verursacht wurden. Denken Sie nicht, dass nur weil es ein "interner Fehler" in der .NET-Laufzeit war, kein Fehler in Ihrem Code als Grundursache vorliegt. Immer immer immer immer den eigenen Code beschuldigen, bevor Sie den eines anderen beschuldigen.

Hoffentlich haben Sie Protokollierungs- und Ausnahme- / Stapelverfolgungsinformationen, die Ihnen zeigen, wo Sie suchen müssen, oder dass Sie den Status des Systems vor dem Absturz wiederholen können.

Jason
quelle
5

Nach Jahren des Ringen mit diesem Problem in einer Reihe von Anwendungen scheint Microsoft es endlich als Fehler in .NET 4 CLR akzeptiert zu haben, der dies verursacht. http://support.microsoft.com/kb/2640103 .

Ich hatte es zuvor "repariert", indem ich den Garbage Collector gezwungen hatte, im Servermodus (gcServer enabled = "true" in app.config) ausgeführt zu werden, wie in dem Microsoft-Artikel beschrieben, auf den Think Before Coding verweist. Dies zwingt im Wesentlichen alle Threads in der Anwendung dazu, während der Erfassung anzuhalten, wodurch die Möglichkeit beseitigt wird, dass andere Threads auf den vom GC manipulierten Speicher zugreifen. Ich bin froh, dass meine jahrelange vergebliche Suche nach einem "Fehler" in meinem Code oder anderen nicht verwalteten Bibliotheken von Drittanbietern nur erfolglos war, weil der Fehler im Code von Microsoft lag, nicht in meinem.

park896
quelle
1
Wie lautet die Versionsnummer der HotFix-Dateien, die Sie erhalten haben? Die in der KB aufgeführte Versionsnummer ist 4.0.30319.526, aber ich habe bereits 4.0.30319.18052. Wird das HotFix noch benötigt oder wurde es in ein Windows Update integriert?
Automatisieren Sie den
1
Wenn ich die HotFix-Exe starte, wird "KB2640103 gilt nicht oder wird durch eine andere Bedingung auf Ihrem Computer blockiert" angezeigt.
Automatisieren Sie den
3

Hatte genau den gleichen Fehler auf der WinXP-Box mit der neuesten Version meines .NET 4-Codes. Frühere Builds überprüft - jetzt stürzen sie auch ab! Ok, also bin ich es nicht :). Keine Vorschläge hier / oben geholfen.

Viel neuerer (2018-05-09) Bericht über dasselbe Problem: Anwendungsabsturz mit Exit-Code 80131506 .

A : Wir haben einen ähnlichen Fehler erhalten, aber wir glauben, dass unser Fehler durch den Citrix Speicheroptimierer verursacht wurde.
Die Lösung bestand darin, eine Regeneration der .NET-Kernbibliotheken auf den Hosts zu erzwingen, auf denen das Problem auftrat:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe update /force

Die Grundursache ist noch unbekannt (Maschine wird nicht aktualisiert und hat wenig Verwendung), aber das hat es für mich getan !

Astrogator
quelle
2

In meinem Fall trat diese Ausnahme auf, als der Speicherplatz abgelaufen war und .NET keinen Speicher im virtuellen Windows-Speicher zuweisen konnte.

Im Ereignisprotokoll habe ich diesen Fehler gesehen:

Anwendungs-Popup: Windows - Minimum des virtuellen Speichers zu niedrig: Ihr System verfügt nur noch über wenig virtuellen Speicher. Windows vergrößert die Auslagerungsdatei für den virtuellen Speicher. Während dieses Vorgangs können Speicheranforderungen für einige Anwendungen abgelehnt werden.

Und vorheriger Fehler:

Die C: -Diskette ist voll oder fast voll. Möglicherweise müssen Sie einige Dateien löschen.

Arthur Smirnov
quelle
1

In meinem Fall war das Problem eine C ++ / CLI-Bibliothek, in der die NtQuerySystemInformation aufgerufen wurde . Aus irgendeinem Grund wurde der CLR-Heap manchmal (und unter mysteriösen Umständen ) beschädigt, als er aufgerufen wurde, und die Anwendung stürzte ab.

Ich habe das Problem mithilfe eines mit HeapCreate erstellten "benutzerdefinierten Heaps" behoben und dort die von dieser Funktion verwendeten Puffer zugewiesen .

SiMoStro
quelle
1

Ich bin mir nicht sicher, ob es allen helfen kann, aber ich könnte das umgehen, indem ich renne

devenv.exe /ResetSettings 

...in dem Weg {Visual_Studio_root}\Common7\Ide

Ich hatte die folgenden Fehler im Ereignisprotokoll und VS stürzte die ganze Zeit nur ab und startete neu:

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: 
Ritesh Varyani
quelle
Das hat auch bei mir funktioniert. Kontext: Ich hatte eine mittelgroße Lösung (~ 25 Projekte) in das .NET Core SDK konvertiert, vor der ein fast leeres Webanwendungsprojekt stand, das vor der Konvertierung den alten WAP ersetzte. Anscheinend widersprachen einige verbleibende Einstellungen den Erwartungen von IISExpress im neuen Projekt.
Tomas Aschan
1

In meinem Fall war das Problem auf doppelte Bindungsumleitungen in meiner web.config zurückzuführen. Mehr Infos hier .

Ich nehme an, es lag daran, dass NuGet die Bindungsumleitungen geändert hat, aber zum Beispiel sah es so aus:

  <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>

Das Entfernen aller Duplikate löste das Problem.

Mark Gibbons
quelle
0

In meinem Fall trat dieser Fehler beim Anmelden in der SAP Business One 9.1-Anwendung auf. In Windows-Ereignissen konnte ich neben dem vom OP gemeldeten auch ein anderes Fehlerereignis finden:

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: 

Auf dem Computer wird Windows 8.1 mit installiertem .NET Framework 4.0 und ohne Version 4.5 ausgeführt. Da es aus dem Internet so aussah, als könnte es sich auch um einen Fehler in .NET 4 handeln, habe ich versucht , .NET Framework 4.5.2 zu installieren, und das Problem behoben.

bläulich
quelle
0

Framework-Version: v4.0.30319 Beschreibung: Der Prozess wurde aufgrund einer nicht behandelten Ausnahme beendet. Ausnahmeinfo: System.Reflection.TargetInvocationException

Ich habe diesen Fehler festgestellt. Die Anwendung funktionierte auf einigen PCs und auf einigen PCs mit dem oben genannten Fehler einwandfrei. Ich deinstalliere das Framework 4.5 und installiere es erneut. Dadurch wurde mein Problem behoben.

Jubeln.

user4815065
quelle
0

Dies kann eine Ausnahme sein, die im Finalizer auftritt. Wenn Sie das Muster von ~ Class () {Dispose (false) ausführen; } Überprüfen Sie, was Sie als nicht verwaltete Ressource bereitstellen. Probieren Sie es einfach aus ... fangen Sie dort und es sollte Ihnen gut gehen.

Wir fanden das Problem, da wir diesen mysteriösen Fehler ohne Protokolle hatten. Wir haben das übliche empfohlene Muster für die Verwendung einer "void Dispose (bool disposing)" angewendet.

Bei Betrachtung der Antworten auf diese Frage zum Finalizer haben wir einen möglichen Ort gefunden, an dem die Entsorgung der nicht verwalteten Ressourcen eine Ausnahme auslösen könnte.

Es stellt sich heraus, dass wir das Objekt irgendwo nicht ordnungsgemäß entsorgt haben, sodass der Finalizer die Einlagerung nicht verwalteter Ressourcen übernommen hat. Siehe, es ist eine Ausnahme aufgetreten.

In diesem Fall wurde die Kafka Rest-API verwendet, um den Client von Kafka zu bereinigen. Scheint, dass es irgendwann eine Ausnahme ausgelöst hat, als dieses Problem auftrat.

Nelson J Perez
quelle
0

Ich habe nie herausgefunden, warum das für mich passiert ist. Es war für eine meiner Anwendungen durchweg reproduzierbar, verschwand jedoch nach einem einfachen Neustart.

Ich verwende Windows 2004 Build 19582.1001 (Insider Preview) mit .net-4.8 und wäre auch nicht überrascht, wenn dies auf einen Hardwarespeicherfehler zurückzuführen wäre. Außerdem lädt meine Anwendung nicht verwalteten Code und initialisiert ihn, sodass ich nicht beweisen kann, dass der Absturz nicht darauf zurückzuführen ist.

Binki
quelle
-1

Alle 5-10 Minuten stürzte mein Anwendungspool mit diesem Exit-Code ab. Ich möchte Ihr Vertrauen in den Garbage Collector nicht ruinieren, aber die folgende Lösung hat bei mir funktioniert.

Ich habe einen Job hinzugefügt, der GC.GetTotalMemory(true)jede Minute anruft .

Ich nehme an, dass der GC aus irgendeinem Grund den Speicher nicht oft genug automatisch auf die hohe Anzahl von Einwegobjekten überprüft, die ich verwende.

Éric Bergeron
quelle