2010-12-01 10 views
1

Ich habe in GDB (C-Code) debuggen. Das Problem ist, wenn ich meine Anwendung ausführen und wenn es abstürzt, kommt die Kontrolle zurück zu main() (App startet neu). Daher wird keine Ahnung haben, wo es abgestürzt ist. Ich verbringe also viel Zeit damit, jede Funktion zu durchlaufen.Hilfe für Debug-Crash-Protokollierung von gdb

Ich würde gerne wissen, ob es trotzdem ein Protokoll aktiviert werden kann, die die letzte Zeile der Ausführung vor dem Absturz erzeugen wird. Dies ist nur meine Annahme, wenn es einen einfacheren Weg gibt, lass es mich wissen, das würde mir viel Zeit sparen!

Auch wenn der gdb ein Protokoll erzeugt wo wäre der Pfad?

Vielen Dank im Voraus.

+2

Können Sie "Crash" definieren? Wenn es ein unbehandeltes Signal (z. B. SIGSEGV) gibt, sollte GDB es abfangen und sofort aufhören, aber es hört sich so an, als würde es nicht passieren. Sie müssen also auf andere Weise "abstürzen". –

+1

GDB kann vordefinierte Befehle verarbeiten, wenn Sie können. Oder, wenn Sie mit Protokoll einen Stack-Trace meinen, schauen Sie sich http://tlug.up.ac.za/wiki/index.php/Ob- taining_a_stack_trace_in_C_upon_SIGSEGV an. Es zeigt, wie ein Stack-Trace auf SIGSEGV generiert wird. Wenn Sie wissen, welches Signal Ihren Absturz verursacht, generieren Sie den Stack-Trace beim Empfang dieses Signals anstelle von SIGSEGV. – vpit3833

+0

Die Steuerung, die zu main() und dem Neustart der Anwendung zurückkehrt, ist nicht wirklich das Gleiche - startet sie tatsächlich in Zeile 1 von main() neu, oder kommt sie gerade zurück in die Zeile, nachdem ein Funktionsaufruf einen Fehler hatte und zurückgegeben wurde? – Cascabel

Antwort

3

Diese Frage ist ein wenig zu mir unklar, aber ich werde einen Stich nehmen:

Wenn Sie GDB mit dem Krachen Prozess angeschlossen haben, wenn er abstürzt, ein Absturz sollte das Programm stoppen und setzen Sie zurück unter der (gdb) Eingabeaufforderung. Wenn Sie dann bt eingeben, sollten Sie den Stapel sehen.

Wenn Sie keine GDB angeschlossen haben, dann this answer to a related question könnte helfen. (Kurz gesagt, vielleicht möchten Sie, dass das System beim Absturz des Programms einen Core Dump erstellt. Ein Core Dump ist nur eine Datei, die viele Informationen über den abgestürzten Prozess enthält. Sie können GDB mit dem Core Dump verwenden, um den Stack zu sehen.)

Wenn Sie nicht wissen, Post, was Sie auf dem Bildschirm sehen, wenn dies passiert, und wir werden raten.

In jedem Fall sollte das Programm definitiv nicht bei main() neu gestartet werden. Es lohnt sich, herauszufinden, warum das passiert und was gerade passiert. Spricht die Steuerung wirklich zu mainin dem gleichen Prozess, im Gegensatz zu einem anderen Prozess wird irgendwie automatisch gestartet?

0

Führen Sie Ihr Programm im gdb-Modus aus.


Unterbrechungspunkt auf erwarteten Standort setzen.

$ break functionName 


Oder setzen Sie den Unterbrechungspunkt auf bestimmte Zeilennummer.

$ break 15 


der Ausführung starten

$ r 


Schritt in die oder die Ausführung herauszutreten durch 's' oder 'n'

$ s 


sobald das Programmabsturz, tun 'bt' für Backtrace.

$ bt 


Sie können durch 'up' & 'down' Befehl

$ up 


auch alternative Art und Weise in der Spur gehen nach oben und unten nehmen. Debug-Programm mit "Core" als Core-Dump-Datei.

$ gdb executableFilename core 
$ bt