Frage

Gibt es eine gcc Option, die ich, dass die Zeilennummer des Segmentierungsfehlers gibt mir einstellen kann?

Ich weiß, ich kann:

  1. Debug Zeile für Zeile
  2. Setzen Sie printfs im Code zu verengen.

Edits:

  1. bt / where auf GDB Keine Stapel geben.
  2. Hilfreiche Vorschlag
War es hilfreich?

Lösung

Ich weiß nicht, von einer gcc-Option, aber Sie sollten die Anwendung mit gdb laufen und dann in der Lage, wenn er abstürzt, Typ where einen Blick auf den Stapel zu nehmen, wenn sie verlassen, was zu bekommen, sollten Sie schließen.

$ gdb blah
(gdb) run
(gdb) where

Bearbeiten der Vollständigkeit halber:

Sie sollten auch über die Verwendung der -g gcc-Option stellen Sie sicher, die Anwendung mit Debug-Flags zu bauen, um Zeilennummern in der ausführbaren Datei enthalten.

Eine andere Möglichkeit ist es, die bt (Backtrace) Befehl zu verwenden.

Andere Tipps

Hier ist eine komplette Schale / GDB-Sitzung

$ gcc -ggdb myproj.c
$ gdb a.out
gdb> run --some-option=foo --other-option=bar
(gdb will say your program hit a segfault)
gdb> bt
(gdb prints a stack trace)
gdb> q
[are you sure, your program is still running]? y
$ emacs myproj.c # heh, I know what the error is now...

Happy Hacking: -)

Sie können gcc erhalten Sie einen Stacktrace zu drucken, wenn Ihr Programm einen SEGV Signal bekommt, ähnlich wie Java und anderen Sprachen freundlicher behandeln Null-Zeiger-Ausnahmen. Siehe meine Antwort hier für weitere Informationen:

Das Schöne daran ist, Sie es in Ihrem Code einfach verlassen können; Sie brauchen nicht die Dinge durch gdb ausführen, um die schöne Debug-Ausgabe zu erhalten.

Wenn Sie mit -g kompilieren und die Anweisungen befolgen, können Sie ein Kommandozeilen-Tool verwenden, wie

Führen Sie es unter valgrind.

Sie müssen auch mit Debug-Flags auf -g

bauen

Sie können auch den Core-Dump mit GDB öffnen (Sie müssen -g obwohl).

Wenn alle vorhergehenden Vorschläge mit Debugging (-g) und laufen unter einem Debugger (GDB, laufen, bt) zu kompilieren arbeiten nicht für Sie, dann:

  • Elementary: Vielleicht laufen Sie nicht unter dem Debugger, sind Sie nur die postmortale Core Dump zu analysieren versucht. (Wenn Sie eine Debug-Sitzung starten, aber das Programm nicht ausgeführt, oder wenn es beendet wird, dann, wenn Sie für einen Backtrace fragen, wird gdb sagen „Kein Stack“ - denn es gibt überhaupt kein laufendes Programm ist nicht vergessen. „run“ eingeben.) Wenn es segfaulted, nicht vergessen das dritte Argument (core) hinzuzufügen, wenn Sie gdb ausführen, sonst hat man im gleichen Zustand beginnen, nicht auf einen bestimmten Prozess oder Speicherbild angebracht.
  • Schwer: Wenn Ihr Programm ist / war wirklich läuft, aber Ihre gdb sagt „Nein Stapel“ vielleicht Ihre Stapelzeiger ist schlecht zerschlagen. In diesem Fall kann man ein Pufferüberlauf Problem irgendwo, stark genug, um Ihren Laufzeitzustand vollständig zerdrücken. GCC 4.1 unterstützt die ProPolice "Stack Smashing Protector", die mit -fstack-protector-all aktiviert ist. Es kann mit einem Patch zu GCC 3.x hinzugefügt werden.

Es gibt keine Methode für GCC diese Informationen zu liefern, werden Sie auf einem externen Programm wie GDB verlassen müssen.

GDB können Sie die Zeile geben, wo ein Absturz mit dem „bt“ aufgetreten (kurz für „Backtrace“) Befehl, nachdem das Programm bemängelt hat seg. Dies gibt Ihnen nicht nur die Linie des Absturzes, sondern den ganzen Stapel des Programms (so können Sie sehen, was die Funktion, wo der Absturz passierte genannt).

Das No stack Problem scheint, wenn das Programm erfolgreich beenden passieren.

Für das Protokoll, ich hatte dieses Problem, weil ich eine Rückkehr in meinem Code vergessen hatte, die mit Fehlercode mein Programm Ausfahrt gemacht.

scroll top