Ich arbeite daran, meinen unerwarteten Fehlerbehandlungsprozess neu zu schreiben, und ich möchte die Community fragen:
Welche Informationen erfassen Sie sowohl automatisch als auch manuell, wenn Software, die Sie geschrieben haben, abstürzt?
Im Moment nehme ich ein paar Dinge auf, von denen einige sind:
Automatisch:
Handbuch:
Welche anderen Informationen erfassen Sie, die Ihnen helfen, die wahre Ursache eines Anwendungsproblems zu erkennen, vor allem angesichts der Tatsache, dass die meisten Benutzer die Tastatur einfach auf die Tastatur packen, wenn Sie gefragt werden, was passiert ist.
Für den Datensatz verwende ich C #, WPF und .NET Version 4, aber ich möchte mich nicht unbedingt auf diese beschränken.
Related: Was zu: Sammeln von Informationen, wenn Software abstürzt
(Dies ist etwas Windows / .NET-spezifisch, aber das ist, was Sie in der Frage angegeben haben, und ich denke, das ist eine ziemlich nützliche Information in diesem Kontext.)
Sofern Ihre Anwendung nicht streng single-threaded ist, möchten Sie eine Dump-Datei (die Ihnen mindestens den Stack für alle Threads liefert), nicht nur eine Stack-Trace für den Thread, der die Ausnahme auslöst.
Das Erzeugen eines Dumps, der nicht zu groß ist und genug Informationen enthält, um Ihnen nützliche verwaltete Stack-Traces zu geben, ist ein bisschen schwierig, aber es gibt ein sehr nützliches Dienstprogramm namens clrdump , die einige der Gorier-Details für Sie behandeln wird.
Clrdump ist meist ein Wrapper für Microsofts DbgHelp.dll. Sie können DbgHelp direkt verwenden - siehe diese Frage - aber dann erhalten Sie einen "full Minidump ", der so groß ist wie der virtuelle Adressraum Ihrer Anwendung, der ziemlich groß sein kann. Clrdump erstellt einen kleinen Dump mit nur den Stack-Traces plus genügend Informationen für SOS, um sie lesen zu können.
Und jetzt aus dem Paranoia Camp: (
Überlegen Sie, auf welche Branche die Software zielt. Das Sammeln von Informationen über den Benutzer (sogar den Namen des aktiven Verzeichnisses) oder das Netzwerk kann dazu führen, dass Ihre App gescheitert ist und potenziell haftbar gemacht wird. Was ist, wenn Ihre Fehlerdatenbank kompromittiert ist und diese Informationen verwendet werden, um in das Labor einer Bank oder eines staatlichen Labors einzudringen? Wird der Fehlerbericht, der ihre IPs enthält, bemerkt? Kannst du verklagt werden? Vielleicht ...
Wenn Sie z. B. netzwerkspezifische Daten zur Diagnose von Netzwerkproblemen sammeln müssen, sollten Sie in Erwägung ziehen, dass Ihre App Systemnamen oder IP-Adressen durch Platzhalter ersetzt, bevor Daten an Sie zurückgesendet werden. (emailSrvr1, bankAcctNumSrv, wird zu srvr1 und srvr2) Es ist ein größerer Schmerz beim Aufspüren von Problemen, aber es kann sich lohnen. Dies erfasst immer noch Informationen, die Sie in Schwierigkeiten bringen können, kann aber helfen.
Ich arbeite seit einigen Jahren mit High-End-Unternehmen und der Regierung, was meine Sichtweise beeinflusst, aber es ist wahrscheinlich eine Überlegung wert, was Sie sammeln und wie es gespeichert wird.
Sie erwähnen nicht die Protokollierung von Prozessen (wie Syslog in Linux, Event Viewer für Windows?). Da ich auch einen Systemadministrator-Hintergrund habe, schätze ich wirklich Programme mit einer Protokollierungseinrichtung. Noch besser, wenn die Ausführlichkeitsstufe ausgewählt werden kann.
Es ist gut für Sie, mehr über die Umgebung zu erfahren, und es ist gut für Ihre Benutzer, wenn sie irgendeine Art von Integrationsarbeit mit anderen Tools ausführen müssen.
Wenn Ihre Benutzer technischer sind, können Sie sie bitten, die Ausführlichkeit der Protokollierung auf das Maximum einzustellen und den Fehler erneut zu reproduzieren.
Grundsätzlich gibt es keine goldene Regel, die Sie befolgen und in jeder Anwendung implementieren müssen. Abhängig von Ihrer Geschäftsanwendung und Ihrem Szenario sind verschiedene Dinge am besten geeignet, um bei einem Fehler in die Informationssammlung einbezogen zu werden.
Die, die du erwähnt hast, sind in Ordnung, aber hier ist ein bisschen mehr, das gut ist, um eingeloggt zu sein:
Beispiel: Der Ablauf Ihres Programms ist wie ein Zustandsautomat und Sie haben 5 Zustände und Sie haben Zustand 3 erreicht.
Wenn Sie eine Anwendung haben, bei der es sich um einen Server-Client handelt, sammeln Sie beide Protokolle - von der Anbieter- und der Verbrauchsseite
memory dump ist im Allgemeinen kein guter Vorschlag - tun Sie es nur, wenn Sie Probleme in Frameworks oder JVM (zum Beispiel) verstehen müssen, auf die Sie keinen Einfluss haben. OutOfMemoryError zum Beispiel
Ich sehe in Ihrer Liste nicht die wichtigsten Informationen (wenn wir über den Code von dotnet / java sprechen).
Der Ausnahmetyp, die Nachricht und die Ablaufverfolgung.
Sie können einfachen Code verwenden, um eine Ausnahme abzufangen, und "schreibe in das Protokoll" / "sende direkt an die E-Mail".
Tags und Links design error-handling production-environment