2013-03-07 4 views
5

die .out ausführbare Datei erstellen, muss ich eingeben:C-Programmierung: Wie gdb mit Makefile und Befehlszeilenargumente zu verwenden?

$: make 
$: myprogram.out name.ged 

Mein Programm ein Argument Befehlszeile enthält, so dass die „name.ged“.

Immer, wenn ich gdb laufen nach einem Segmentierungsfehler bekommen (core dumped), I eingeben:

$: gdb a.out core 
(gdb): bt 

ich dann die Rückverfolgung Befehl verwenden, und gdb kehrt:

#0 0x4a145155 in ??() 
#1 0x08a16ce0 in ??() 

ich sogar versucht, mit dem up-Befehl t den Stapel nach oben, aber immer noch kein Glück. Ich kann nicht sagen, welche Zeile in meinem Programm mir den Seg-Fehler gibt. gdb arbeitet mit meinen anderen Programmen, die kein Makefile und keine Befehlsargumente enthalten, also frage ich mich, ob meine Befehle falsch sind.

+4

Sie müssen sich mit dem '-g' Flagge kompilieren. Da Sie das Makefile nicht veröffentlicht haben, kann ich Ihnen keine weitere Hilfe geben. –

+0

Also wäre der Befehl gcc -g myprogram.out name.ged? – Bonnie

+0

In der make-Datei gibt es einen Befehl zum Kompilieren des Codes (gcc ...) Dieser Befehl benötigt das Flag -g, um zusätzliche Informationen hinzuzufügen, damit gdb effektiv funktioniert. –

Antwort

7

Zusammenfassung der Kommentare (bevor jemand anderes tut :).

In Ihrer ausführbaren Datei fehlen die symbolischen Informationen, die gdb zum Anzeigen des entsprechenden Quellcodes benötigt. Sie müssen dem Kompilierbefehl die -g-Option hinzufügen und eine neue ausführbare Datei erstellen. Führen Sie dann den fehlgeschlagenen Test erneut aus, um eine neue Core-Datei zu erstellen. gdb mit dieser ausführbaren und Kern wird in der Lage, Ihnen den Stapel von Funktionsaufrufen mit backtrace zu zeigen.

In einem Makefile ist der einfachste Weg, dies zu tun, die Variable CFLAGS hinzuzufügen, die mit der impliziten .o.c-Regel verwendet wird.

Sie können dies auch direkt zur Befehlszeile hinzufügen (unter der Annahme einer anständigen Shell :). Dadurch wird der Wert während der Ausführung des Befehls make (und der Unterbefehle) als Umgebungsvariable festgelegt.

$ CFLAGS='-g -Wall -Wextra' make 

Ich würde Sie diese auf Ihre bash .profile tatsächlich empfehlen hinzuzufügen, so dass Sie immer die meisten Informationen aus dem Compiler erhalten.

CFLAGS='-Wall -Wextra' 

Dann, wenn Sie es brauchen, setzen diese in der Make-Datei mit einem Debugger ausführbar zu machen:

CFLAGS+= -g