2016-05-19 10 views
2

Ich bin ein Java-Entwickler versucht meine Hände auf C-C++ - Code. Grundsätzlich habe ich ein Build-Skript, das Visual Studio-Komponenten verwendet, um die Anwendungsbibliotheken zu erstellen - dlls. Wir verwenden Visual Studio IDE nicht zum Debuggen.Get Stacktrace während eines Anwendungsabsturzes - c/C++

Aber immer wenn wir in unserer Anwendung einen Absturz haben, müssen wir die Debug-Anweisungen Zeile für Zeile eingeben und müssen die genaue Zeile des Codes überprüfen, in dem es abstürzt.

Gibt es eine API in C/C++, die den Stack-Trace während des Absturzes unseres Programms in eine Datei schreiben würde?

Eine Art von Ereignis-Listener, die während eines Programm-Exits aufgerufen wird und die Stack-Trace- und Fehlerinformationen in eine Protokolldatei drucken kann.

Ich habe viele Fragen dazu gesehen, aber ich bin nicht in der Lage zu bekommen, wie man dies in Code statt Debugging-Tools zu behandeln. Ich denke, Java ist in Bezug auf die Fehlerbehandlung sehr weit fortgeschritten.

Vielen Dank im Voraus!

+1

Führen Sie es in einem Debugger, können Sie den Stack-Trace von diesem erhalten. – Galik

+2

Dass Sie die Visual Studio IDE zum Debuggen nicht verwenden, ist eine Schande, denn ich bin wohl der beste Debugger der Welt für Windows-Programme im Benutzermodus. Zur Not könnte man einfach WinDbg verwenden, das ist viel robuster und vielseitiger als Visual Studio, aber um den Preis von * beträchtlich * komplizierter zu benutzen (aber wenn man darüber hinaus kommt, kann es einige erstaunliche Dinge tun). – WhozCraig

Antwort

4

Der Standard gibt Ihnen keine Möglichkeiten dafür. Das heißt, Sie können OS-spezifische APIs verwenden, um zu bekommen, was Sie wollen. Unter Windows ist es wahrscheinlich am einfachsten, StackWalker zu verwenden. Sie müssen sich selbst um SEH Kuriositäten kümmern. Ich empfehle this article für weitere Informationen.

Auf POSIX-Plattformen können Sie die Funktion backtrace von glibc verwenden.

Im Allgemeinen erfordern beide, dass Ihr Programm mit Debug-Informationen kompiliert wird. Es ist auch möglich, Crash-Dumps ohne Symbolnamen zu erstellen (siehe Minidumps unter Windows), aber Sie müssen sie dekodieren (was Visual Studio zum Beispiel für Sie tut, aber Sie haben in Ihrem Beitrag erwähnt, dass Sie es nicht verwenden).

Denken Sie auch daran, dass das Schreiben von Crash-Dumps von einem Absturzprozess sehr fehleranfällig ist (da Sie wirklich keine Ahnung haben, in welchem ​​Zustand Ihre Anwendung zu dieser Zeit ist). Sie erhalten möglicherweise zuverlässigere Ergebnisse, wenn Sie die Crash-Dumps von einem anderen Prozess schreiben. Früher habe ich eine einfache example out-of-process crash handler zusammengestellt, die zeigt, wie Sie das implementieren.

-1

Sie könnten <errno.h> in C verwenden, um Ihren Fehler zu behandeln und sie in einer Protokolldatei zu protokollieren. Der Standardfluss für die Fehler ist stderr.

Eine Lösung, um den Fehler zu erhalten, ist die Verwendung der Funktion perror, die in <errno.h> enthalten ist, die den genauen Fehler anzeigt.

Um es zu verwenden, legen Sie es in einen Fehlerfänger.

if (!fileIsOpen()) 
    perror("File not opened"); 

Ich hoffe, es hat geholfen.

1

Sie können std::set_terminate verwenden, um eine Funktion zu definieren, die aufgerufen wird, wenn eine Ausnahme main() hinterlässt. Außerdem können Sie einen Signalhandler für SIGSEGV installieren, um Segmentierungsfehler abzufangen.

Sie können eine Stack-Trace (unter Linux) mit libunwind (http://www.nongnu.org/libunwind/) oder verwenden Sie die backtrace()-Funktion von libc.

Eine Sache, die ich manchmal in meinen eigenen Exception-Klassen mache, ist, einen StackTrace im Konstruktor zu erfassen und zu speichern, den ich dann abrufen kann, wo ich die Exception abfange und den Trace von wo er geworfen wurde.