Wie lade ich das Programm, lese stdin und nehme Parameter in gdb?

101

Ich habe ein Programm, das Eingaben von stdin und einige Parameter von der Kommandozeile übernimmt. Es sieht aus wie das:

cat input.txt > myprogram -path "/home/user/work"

Ich versuche, den Code mit gdb in emacs zu debuggen. Mit Mx gdb versuche ich, das Programm mit dem folgenden Befehl zu laden:

gdb cat input.txt > myprogram -path "/home/user/work"

Gdb mag es jedoch nicht.

Frage von hier abgeschnitten . Leider verstehe ich die Lösung nicht und bin mir nicht sicher, was ich tun soll, außer mit der -gOption zu kompilieren und den Befehl Mx gdb auszuführen.

vinc456
quelle

Antworten:

132

Wenn Sie es von einer Shell aus tun würden, würden Sie es so machen:

% gdb myprogram
gdb> run params ... < input.txt

Dies scheint auch innerhalb von Emacs zu funktionieren.

Alnitak
quelle
Die Umleitung scheint zu funktionieren, aber ich erhalte einige Fehler. Fehler beim Lesen eines gültigen Objektdateibilds aus dem Speicher. Programm mit Code 042 beendet. Irgendwelche Ideen?
vinc456
Dies ist wahrscheinlich ein allgemeiner GDB-Fehler und hat wahrscheinlich nichts mit der Tatsache zu tun, dass Sie in Emacs ausgeführt werden. Erfahren Sie, wie Sie GDB zuerst von einer Shell aus ausführen (ggf. mit einer neuen Frage) und sich dann darum kümmern, es in Emacs auszuführen.
Alnitak
1
Ich habe es herausgefunden. Aus irgendeinem Grund habe ich void main (int argc, char * argv []) anstelle von "int main ..." eingegeben und es ist mir ins Auge gefallen. Jedenfalls funktioniert jetzt alles gut; danke für Ihre Hilfe!
vinc456
2
Ein verspätetes Dankeschön - das GDB-Handbuch ist ein Schmerz im Hintern, durch den man sich ausbaggern muss.
Gelöscht
1
Unter Windows mit msys64 bekomme ich <und input.txtals argvArgumente für mein Programm :( Ich werde diese Antworten mit meiner GDB 8.2.1 weiter
ixe013
32

Es gibt verschiedene Möglichkeiten, dies zu tun:

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

oder

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

oder

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

Dabei verwendet der runBefehl gdb ( r) standardmäßig die zuvor festgelegten Argumente set args.

maxschlepzig
quelle
4
Wenn ich das mit gdb in cygwin versuche, funktioniert es nicht. Der Befehl "show args" zeigt an, dass ich die gewünschten Argumente eingegeben habe. Wenn ich das Programm jedoch mit "r" starte, wartet das Programm, bis ich etwas eingebe, anstatt aus der angegebenen Datei zu lesen.
Cardiff Space Man
1
@cardiffspaceman, nun, ich kann es nicht mit Cygwin testen - vielleicht ist ihre GDB-Version irgendwie begrenzt
maxschlepzig
Warum nicht einfach gdb -ex 'r -path /home/user/work < input.txt' myprogramin der dritten Variante?
Ruslan
@ Ruslan, funktioniert auch - mit 'set args ...' haben Sie nur die Möglichkeit, einige
Haltepunkte
Richtig, aber Sie können den Haltepunkt auch nicht interaktiv festlegen, z gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Ruslan
6

Der Vollständigkeit halber gibt es beim Starten einer Debugging-Sitzung auch die Option --args. dh)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3
vinc456
quelle
14
Wie würden Sie input.txt als Eingabe in Ihr Programm umleiten, wenn Sie eine Debugging-Sitzung wie diese starten?
Peter Ajtai
1
@ Peter:gdb --args yourprog.out input.txt
Ben Elgar
1
Dies funktioniert nur, wenn "yourprog" erwartet, dass ein Dateiname die Eingabe angibt, nicht die Umleitung der Eingabe.
Alnitak
0

Und wenn Sie nicht von Anfang an debuggen müssen, können Sie auch eine Verbindung zu einem bereits laufenden Prozess herstellen, indem Sie Folgendes verwenden:

$ gdb myprogram xxx

Dabei ist xxx die Prozess-ID. Dann müssen Sie gdb nicht die Startargumente mitteilen.

Zitrax
quelle
4
Sie haben es versäumt, den Titel der Frage im Teil "read stdin" zu beantworten. Ich würde irgendwo einen guten Kommentar abgeben, wenn er kürzer wäre.
Notinlist