Frage

Wenn meine C ++ App stürzt auf Windows Ich möchte nützliche Debug-Informationen auf unseren Server senden.

Unter Linux würde ich die GNU backtrace() Funktion - ist es ein Äquivalent für Windows

Gibt es eine Möglichkeit nützliche Debugging-Informationen zu extrahieren, nachdem ein Programm abgestürzt ist? Oder nur aus dem Prozess heraus?

(Beratung entlang der Linien von „test Sie app, so dass es nicht abstürzt“ ist nicht hilfreich - alle nicht-triviale Programme haben Bugs)

War es hilfreich?

Lösung

Die Funktion Stackwalk64 können verwendet werden, um einen Stack-Trace zu schnappen unter Windows.

Wenn Sie beabsichtigen, diese Funktion zu nutzen, sollten Sie sicher sein, Ihren Code mit FPO deaktiviert zu kompilieren -. Ohne Symbole, StackWalk64 nicht in der Lage, richtig zu FPO'd Rahmen geht

Sie können einen Code erhalten in Prozess über eine Top-Level-__try/__except Block zum Zeitpunkt des Absturzes ausgeführt durch SetUnhandledExceptionFilter aufrufen. Das ist ein bisschen unzuverlässig, da es erfordert, dass Sie Code läuft innerhalb eines abgestürzten Prozess haben. Alternativ können Sie auch nur die integrierte Windows-Fehlerberichterstattung zu Absturz Daten zu sammeln. Dies ist zuverlässiger, da es erfordert keinen Code läuft hinzuzufügen innerhalb der kompromittiert, Prozess abgestürzt. Die einzigen Kosten, ist ein Codesignaturzertifikat zu bekommen, da Sie eine signierte binäre dem Dienst einreichen müssen. https://sysdev.microsoft.com/en-US/Hardware/signup/ hat weitere Details.

Andere Tipps

Sie können die Windows-API-Aufruf verwenden MiniDumpWriteDump wenn Sie es wünschen Ihren eigenen Code zu rollen. Sowohl Windows XP und Vist diesen Prozess automatisieren und Sie können unter https://winqual.microsoft.com Sie erhalten Zugang zu den Fehlermeldungen.

Überprüfen Sie auch http://kb.mozillazine.org/Breakpad und http://www.codeproject.com/KB/debug/crash_report.aspx für andere Lösungen .

Diese Website bietet eine recht detaillierte Übersicht über Stapel Retrieval auf Win32 nach einer C ++ Ausnahme:

http://www.eptacom.net/pubblicazioni/pub_eng/except.html

Natürlich wird dies nur aus dem Prozess heraus arbeiten, so dass, wenn der Prozess zu dem Punkt beendet oder stürzt wird, wo es endet, bevor der Code ausgeführt wird, wird es nicht funktionieren.

Generieren Sie eine Minidump-Datei. Sie können es dann in windbg oder Visual Studio laden und den gesamten Stapel prüfen, wo der Absturz aufgetreten.

Hier einen guten Platz zu lesen zu beginnen.

Das ist ganz einfach die aktuellen Stackframe-Adressen in eine Log-Datei auszugeben. Alles, was Sie tun müssen, ist eine solche Funktion auf Programmfehler (das heißt ein Interrupt-Handler in Windows) oder behauptet genannt zu bekommen. Dies kann auch bei freigegebenen Versionen erfolgen. Die Log-Datei kann dann mit einer Map-Datei mit Funktionsnamen in einem Call-Stack resultierenden angepasst werden.

Ich veröffentlichte einen Artikel über diese vor einigen Jahren.

Siehe http://www.ddj.com/architect/185300443

Lassen Sie mich beschreiben, wie ich Abstürze in meinem C ++ / WTL-Anwendung behandeln.

Als erstes wird in der Hauptfunktion, ich nenne _set_se_translator , und übergeben Sie in einer Funktion, die eine C ++ Ausnahme statt mit strukturierten Fenstern Ausnahmen werfen. Diese Funktion ruft einen Fehlercode, für die Sie eine Windows-Fehlermeldung über Format bekommen und ein PEXCEPTION_POINTERS Argument, mit dem Sie eine minidump schreiben können ( Code hier ). Sie können auch den Ausnahmecode für bestimmte „Kernschmelze“ Fehler überprüfen, die Sie von nur bürgen sollten, wie EXCEPTION_NONCONTINUABLE_EXCEPTION oder EXCEPTION_STACK_OVERFLOW :) (Wenn es wiederherstellbare ist, ich den Benutzer auffordern, mir diese Minidump-Datei per E-Mail.)

Die Minidump-Datei selbst kann in Visual Studio wie ein normales Projekt geöffnet werden, und Bereitstellen Sie haben eine PDB-Datei für die ausführbare Datei erstellt, Sie das Projekt ausführen können, und es wird auf die genaue Lage des Absturzes springen, zusammen mit dem Call-Stack und Registern, die vom Debugger untersucht werden können.

Wenn Sie eine Aufrufliste (plus andere gute Infos) für eine Laufzeit Absturz greifen wollen, auf einem Release-Build auch vor Ort, dann müssen Sie einen href einzurichten <= "http://support.microsoft.com/ kb / 308538" rel = "nofollow noreferrer"> Dr Watson (run Drwtsn32.exe). Wenn Sie die Option überprüfen ‚Crash-Dumps erzeugen‘, wenn eine App abstürzt, wird es eine Mini-Dump-Datei auf den Pfad angegeben (genannt user.dmp) schreiben.

Sie können dies nehmen, kombinieren sie mit den Symbolen Sie erstellten, wenn Sie Ihren Server (setzen Sie diese in Ihrem Compiler / Linker aufgebaut PDB-Dateien zu erzeugen - halten diese sicher zu Hause, können Sie sie verwenden, um die Müllkippe entsprechen, damit sie arbeiten können aus der Quelle, wo der Absturz aufgetreten ist)

Holen Sie sich windbg , öffnen und verwenden Sie die Menüoption ‚load Crash-Dump‘. Sobald es alles geladen wird können Sie ‚~ # kp‘ geben Sie eine Aufrufliste für jeden Thread zu bekommen (oder auf die Schaltfläche klicken Sie oben für den aktuellen Thread).

Da sind guten Artikel zu wissen, wie diese über das Web zu tun, Diese ist mein Favorit, und Sie werden href="http://msdn.microsoft.com/en-gb/magazine/cc301459.aspx" rel="nofollow noreferrer"> lesen Sie zum

Sie müssen eine Dump Generation Framework in Ihrer Anwendung einrichten, hier ist, wie Sie es tun können.

Sie können dann die Dump-Datei zur weiteren Analyse auf den Server laden mit Dump-Analysatoren wie windbg.

Sie möchten adplus verwenden, um den Absturz Aufrufliste zu erfassen.

Sie können Debugging-Tools für Windows herunterladen und installieren.

Die Verwendung von adplus wird hier erwähnt: Adplus Nutzung

Dies schafft den kompletten Absturz oder Dump hängen. Sobald Sie den Dump haben, kommt Windbg zur Rettung. Ordnen Sie die richtigen PDBS und Symbole, und Sie sind alle gesetzt den Dump zu analysieren. So starten Sie mit der Verwendung des Befehl "! Analyze -v"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top