Ich habe eine C ++ - App, die große Teile des Codes in try-Blöcke verpackt. Wenn ich Ausnahmen abfange, kann ich den Benutzer in einen stabilen Zustand zurückversetzen, was nett ist. Aber ich erhalte keine Crash-Dumps mehr. Ich möchte wirklich herausfinden, wo im Code die Ausnahme stattfindet, damit ich sie protokollieren und beheben kann.
Es wäre ideal, einen Speicherauszug zu bekommen, ohne die Anwendung anzuhalten, aber ich bin mir nicht sicher, ob das möglich ist.
Gibt es eine Möglichkeit, herauszufinden, wo die Ausnahme innerhalb des catch-Blocks geworfen wurde? Wenn es nützlich ist, verwende ich natives msvc ++ auf Windows XP und höher. Mein Plan ist, einfach die Abstürze in eine Datei auf den Computern der verschiedenen Benutzer zu protokollieren und dann die Absturzprotokolle hochzuladen, sobald sie eine bestimmte Größe erreicht haben.
Dies ist möglich mit SEH (strukturierte Ausnahmebehandlung). Der Punkt ist, dass MSVC C ++ - Ausnahmen über SEH implementiert. Auf der anderen Seite ist das reine SEH viel stärker und flexibler.
Das sollten Sie tun. Anstatt reine C ++ zu verwenden, versuchen Sie / catch Blöcke wie folgt:
%Vor% Sie sollten den inneren Codeblock DoSomething
mit dem SEH-Block umbrechen:
Das heißt, wir setzen innerhalb des C ++ - try / catch-Blocks einen weiteren rohen SEH-Block, der nur alle Ausnahmen ablegt, ohne sie zu fangen.
Siehe hier für ein Beispiel für die Verwendung von MiniDumpWriteDump.
Es ist möglich, Ihre Ausnahmen so zu gestalten, dass Quelldateinamen & amp; Linien Nummern. Um dies zu tun, müssen Sie eine Klasse erstellen, die von std::exception
abgeleitet ist und die Informationen enthält. Im folgenden Beispiel habe ich eine Bibliothek mit Ausnahmen für meine Anwendung, einschließlich my_exception
. Ich habe auch eine traced_error
, die eine Vorlagenausnahmeklasse ist, die von meinen Ausnahmen auf Anwendungsebene abgeleitet ist. Die Ausnahme traced_error
enthält Informationen über den Dateinamen & amp; Zeilennummer und ruft die Ausnahmeklasse ' what()
' auf Anwendungsebene auf, um detaillierte Fehlerinformationen zu erhalten.
Die Ausgabe dieses Programms ist:
Datei:. \ main.cpp Zeile: 57 Fehler: my_exception ist was
Sie könnten dies auch so umgestalten, dass die Ausnahmen auf Anwendungsebene von traced_error
abgeleitet werden und nicht umgekehrt, wenn Sie lieber bestimmte Ausnahmen auf Anwendungsebene abfangen möchten. In Ihrem catch
können Sie den Fehler in einer Protokolldatei & amp; Erstellen Sie eine Speicherabbilddatei mithilfe von MiniDumpWriteDump () .
Sie können Dumps mit MiniDumpWriteDump -Funktion schreiben.
Wenn Sie C ++ - Ausnahmen verwenden, können Sie einfach Datei- / Zeilen- / Funktionsinformationen einfügen (so dass Sie sie als Text sehen, wenn Sie std :: exception.what ()) an einer beliebigen Stelle aufrufen, an die Sie sie werfen Ausnahme (mit den Makros
Sie müssen den Stapel analysieren, um herauszufinden, woher die Ausnahme kommt. Für msvc gibt es eine Bibliothek namens dbghelp.dll , die Ihnen helfen kann Loggen Sie die Ausnahmen aus. Im Allgemeinen mache ich eine Minidump-Datei aus und benutze diese Option, um das Problem erneut zu spielen richtige Programmdatenbank (PDB-Datei). Dies funktioniert auf Kundensystemen, die nicht mit Quellcode geliefert werden oder denen Sie keine pdbs geben möchten.
Ein Trick, der compilerunabhängig ist, besteht darin, die throw-Anweisung in eine Funktion zu schreiben. Die Funktion kann andere Aufgaben ausführen, bevor sie die Ausnahme auslöst, z. B. die Aufzeichnung in einer Protokolldatei. Es ist auch ein praktischer Ort, um einen Haltepunkt zu setzen. Wenn Sie ein Makro zum Aufrufen der Funktion erstellen, können Sie automatisch die __FILE__
und __LINE__
angeben, bei denen der Wurf aufgetreten ist.
Tags und Links c++ visual-c++ logging exception