5

Ich erhalte einen APPCRASH von meiner C# Anwendung. Die Runtime gibt die Fehlermeldung "Diese Anwendung hat die Runtime angefordert, um sie auf ungewöhnliche Weise zu beenden". Wenn ich dann auf "OK" klicke, erscheint die Meldung "MyApplication is funktioniert nicht mehr" mit den üblichen Optionen "Online prüfen für eine Lösung", "Programm schließen" und "Programm debuggen". Wenn ich auf "zusätzliche Details" klicke, bekomme ich die APPCRASH-Signatur mit vielen zusätzlichen Informationen. Einige davon sind vom Menschen lesbar, einige sind nur Hex-Zahlen. Der "Ausnahmecode" ist 40000015. Es gibt auch Zeilen mit "Zusatzinformationen". Meine Frage ist: Weiß jemand im Universum, was die Informationen in einer APPCRASH-Nachricht bedeuten?Was bedeuten die Details einer APPCRASH-Nachricht?

Es scheint, als ob die Nachricht von jemandem gelesen werden sollte, der eine Ursache daraus erkennen kann. Bei der Suche nach Antworten habe ich viele Leute gefunden, die genau die gleichen Nachrichten gepostet haben. Leider habe ich keine Erklärungen gefunden, was diese Informationen bedeuten.

Auch habe ich die "Debug-Programm" -Option versucht, aber es ist nicht hilfreich. Es bringt mich einfach in System Dlls mit keinem Code auf den Call-Stack. Ich habe untersucht, und der Fehler tritt in diesem Systemcode nicht auf.

Die APPCRASH-Nachricht benannte eine andere DLL als das "Fehlermodul" (dieser Code verwendet viele externe DLLs), und der schwerwiegende Fehler tritt dort wahrscheinlich auf. Aber diese Information ist nicht sehr hilfreich, da ich den Platz in meinem Code finden muss, der die externe DLL schlecht anruft (oder sie in einen schlechten Zustand versetzt). Wenn ich "mein Code" sage, meine ich nur den Code, mit dem ich arbeite. Es ist eine riesige Codebase, die von ein paar Dutzend Leuten über ein paar Jahre hinweg geschrieben wurde, so dass ich nicht nur Orte erraten kann, die den fatalen Anruf auslösen könnten. Deshalb hoffte ich, mehr Informationen aus der APPCRASH-Nachricht zu erhalten. Das ist auch der Grund, warum ich mit Details sehr geizig bin. Das Ganze ist alles sehr proprietär mit viel Bürokratie. Deshalb habe ich auch den Inhalt der APPCRASH-Nachricht nicht gepostet.

Um klar zu sein, ich bitte Sie nicht, mein Problem für mich zu debuggen. Ich habe keine Möglichkeit, Ihnen einen reproduzierbaren Fall des Fehlers zu geben, und ich bitte niemanden, mir die Ursache des Fehlers in meinem speziellen Fall zu nennen. Ich möchte nur wissen, wie man diese Hex-Zahlen interpretiert, und ich konnte keine Dokumentation finden.

+0

Es ist der Ausnahmecode, der verwendet wird, wenn systemeigener C- oder C++ - Code die Funktion abort() aufruft. Wir können Ihnen nicht helfen, es zu finden, aber es befindet sich eindeutig in den System Dlls, in die Sie sich verirrt haben. –

+0

Die Ausnahme tritt nicht im Systemcode auf, den der Debugger mir gegeben hat; aber es ist wahrscheinlich eine Ausnahme in einer anderen externen DLL auftritt. Wenn das von einem abort() Anruf ist, dann stirbt es irgendwo in unkontrolliertem Land. – user1646801

+1

Klingt, als hätten Sie Probleme mit nicht verwaltetem Code. Um das Problem zu isolieren, würde ich versuchen, in Ihrem Code nach [DllImport] zu suchen und zu versuchen, zu spotten, dies zu kommentieren und zu sehen, ob Sie weniger Probleme haben. Andere Idee ist, wenn Sie Komponenten von Drittanbietern haben, die falsche nicht verwaltete Anrufe haben können. Versuchen Sie zuletzt, WinDBG und suchen Sie nach dem Problem. WinDBG wird meine letzte Ressource sein, da ich kein Spezialist bin und es ist eine sehr hardcore Art des Debuggens. –

Antwort

1

Es bedeutet, dass Sie eine nicht abgefangene Ausnahme ohne Ausnahme haben und Ihre Anwendung abstürzt.

Wenn es im Debug-Modus arbeitet, müssen Sie schauen, um zu sehen, was sich in der Release-Version unterscheidet. Sind alle Bibliotheken vorhanden? Hast du dein app.config Setup?

Überprüfen Sie Ihre Ereignisanzeige unter Windows-Protokolle -> Anwendung für weitere Informationen.

Wenn Sie einen Ausnahmebehandler einrichten, erhalten Sie viel bessere Informationen, z. B. einen Stack-Trace.

+0

Hallo, danke für die Antwort. Leider habe ich alle üblichen Tricks ausprobiert und bin nicht sehr weit gekommen. Derzeit im Debug-Modus ausgeführt, und es bricht. Ich habe den Debugger so eingestellt, dass er nicht behandelte Ausnahmen unterbricht und keine fängt. Die Informationen in der Ereignisanzeige sind nicht detaillierter als die Appcrash-Nachricht. – user1646801

+0

@dmck - Es gibt einige schlechte Ass-Ausnahmen (wie StackOverflowException oder OutOfMemory-Ausnahmen), die den AppDomain-Status beschädigen. Diese Ausnahmen können nicht protokolliert/zwischengespeichert werden, wenn sie real auftreten –

0

Sie müssen einen Crashdump erstellen, der im Nachhinein analysiert werden kann. Sie müssen einige Änderungen an der Registrierung vornehmen und dann können Sie die Speicherabbilddatei mit Visual Studio analysieren. Hoffentlich gibt das Ihnen mehr Hinweise wie bestimmte Funktion, die versagt.

Sehen Sie diese Website für Details: http://blog.functionalfun.net/2013/05/how-to-debug-silent-crashes-in-net.html

Sie DebugDiag Einrichtung werde, ein Tool von Microsoft.

Lassen Sie mich wissen, wie die Dinge laufen oder wenn Sie ein besseres Werkzeug finden.

Grüße,

Dave

8

Hier ein Beispiel für eine App Crash Nachricht ist:

Problem signature: 
Problem Event Name: APPCRASH 
Application Name: WINWORD.EXE 
Application Version: 12.0.4518.1014 
Application Timestamp: 45428028 
Fault Module Name: StackHash_7ae5 
Fault Module Version: 6.0.6000.16386 
Fault Module Timestamp: 4549bdc9 
Exception Code: c0000374 
Exception Offset: 000af1c9 
OS Version: 6.0.6000.2.0.0.256.4 
Locale ID: 1033 
Additional Information 1: 7ae5 
Additional Information 2: 4cf2e59e469447e0692da79a5a9446de 
Additional Information 3: 333f 
Additional Information 4: 583336399425ab3efc33bdfbb60895ee 

Anwendungsname und Anwendungsversion ist einfach, da der Zeitstempel ist (dies ist das geänderte Datum im Datei-Explorer als 32-Bit-Unix-Timestamp-Wert codiert). Das Fehlermodul ist normalerweise ein DLL-Name und der Ausnahme-Offset ist die Offset-Adresse des Hardware-Befehls in der DLL, der den Fehler verursacht hat. In diesem Fall war es ein interner Laufzeitfehler, bei dem kein gültiges Modul abgerufen werden konnte. Daher haben wir StackHash anstelle eines echten Werts erhalten. Die Versionen sind die normalen PE-Versionszeichenfolgen ausführbarer Dateien in Windows. Die Gebietsschema-ID ist die verwendete Bank für die Globalisierungseinstellungen: 1033 ist en-US.

Der Ausnahmecode kann interpretiert werden here. In diesem Beispiel war der Fehler ein STATUS_HEAP_CORRUPTION.

Die zusätzlichen Informationsfelder sind undurchsichtige Daten und basieren auf dem Ausnahmecode. Ich kenne keine nützlichen Informationen zu diesen Feldern, wahrscheinlich gibt es keine, und es ist wahrscheinlich, dass diese Felder absichtlich nicht dokumentiert sind, so dass Microsoft sie nach Bedarf ändern kann. Diese Felder sind in der Regel MD5-Hashes mit vielen Informationen ... es ist im Grunde vorhanden, so dass viele Informationen über den Hashcode schnell miteinander verglichen werden können, so dass Sie wissen, ob der Fehler auf den gleichen Ausführungszustand zurückzuführen ist .

0

Es ist ein nettes Feature in .net, Managed Debugger Assistants, zu beheben systemeigenen und verwalteten Code interoperations MSDN article about using it here

Ausnahmen von MDA geworfen kann in Visual Studio Ausnahmen sehen Fenster konfiguriert werden.