Informationen darüber, wo C ++ - Ausnahmen in catch-Block geworfen werden?

8

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.

    
tfinniga 11.06.2010, 22:27
quelle

5 Antworten

5

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:

%Vor%

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.

    
valdo 11.06.2010, 22:44
quelle
4

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.

%Vor%

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 () .

    
John Dibling 11.06.2010 23:13
quelle
1

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

SigTerm 11.06.2010 22:41
quelle
1

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.

    
jdehaan 11.06.2010 22:39
quelle
1

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.

    
Mark Ransom 11.06.2010 22:54
quelle

Tags und Links