it-swarm.com.de

Wie führe ich ein Programm mit Befehlszeilenargs aus, die gdb innerhalb eines Bash-Skripts verwenden?

Beim Ausführen eines Programms unter gdb werden die Argumente für das Programm normalerweise mit dem Befehl run angegeben. Gibt es eine Möglichkeit, das Programm mit gdb auszuführen und Argumente innerhalb eines Shell-Skripts anzugeben? 

Ich habe eine Antwort in einer verwandten Frage gesehen und erwähnt, dass wir die gdb an das Programm anhängen können, nachdem das Skript ausgeführt wurde. Aber dann muss ich das Programm "abwarten".

Ich bin gespannt, ob es einen anderen Weg gibt, dies zu tun.

304
drox

Sie können gdb mit dem Parameter --args ausführen.

gdb --args executablename arg1 arg2 arg3

Wenn Sie möchten, dass es automatisch ausgeführt wird, platzieren Sie einige Befehle in einer Datei (z. B. "run") und geben Sie es als Argument an: -x/tmp/cmds. Optional können Sie den Batch-Modus ausführen.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
432
Hugo Ideler
gdb -ex=r --args myprogram arg1 arg2

-ex=r ist die Abkürzung für -ex=run und weist gdb an, Ihr Programm sofort auszuführen, anstatt darauf zu warten, dass Sie an der Eingabeaufforderung "run" eingeben. Dann sagt --args, dass alles, was folgt, der Befehl und die Argumente sind, genau wie Sie sie normalerweise an der Eingabeaufforderung eingeben.

92
Hugo

Eine andere Methode, die ich persönlich etwas bequemer und intuitiver finde (ohne sich an den --args-Parameter zu erinnern), besteht darin, normal zu kompilieren und r arg1 arg2 arg3 direkt in gdb zu verwenden, wie folgt:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
29
aspiring_sarge

Sie könnten eine Datei mit Kontext erstellen:

run arg1 arg2 arg3 etc

program input

Und gdb gerne anrufen

gdb prog < file
9

gdb hat --init-command <somefile> wo Somefile eine Liste von gdb-Befehlen zur Ausführung hat. Ich benutze dies, um //GDB Kommentare in meinem Code zu haben, dann `

echo "file ./a.out" > run
grep -nrIH "//GDB"|
    sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
    awk '{print "b" " " $1}'|
    grep -v $(echo $0|sed "s/.*\///g") >> run
gdb --init-command ./run -ex=r

als Skript, das den Befehl zum Laden der Debugsymbole enthält und dann eine Liste von Break-Befehlen generiert, um einen Haltepunkt für jeden //GDB-Kommentar zu setzen, und die Ausführung startet

1
Austin_Anderson

Eine Ergänzung zur Antwort von Hugo Ideler . Bei der Verwendung von Argumenten, die ein Präfix wie -- oder - verwenden, war ich nicht sicher, dass es einen Konflikt mit gdb geben würde.

Es scheint, dass gdb alle Optionen nach args als Argumente für das Programm benötigt.

Zuerst wollte ich sicher gehen, dass ich gdb mit Anführungszeichen um Ihre Argumente lief, es wird beim Start entfernt.

Das funktioniert auch, aber optional:

gdb --args executablename "--arg1" "--arg2" "--arg3"

Das funktioniert nicht:

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui

In diesem Fall wird -tui als mein Programmparameter und nicht als gdb-Parameter verwendet.

1
Sandburg

Wenn der --args-Parameter auf Ihrem Computer nicht funktioniert (d. H. Unter Solaris 8), können Sie gdb so starten

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"

Und Sie können dies kombinieren, indem Sie eine Datei in stdin eingeben und "sofort ausführen":

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
0
Johannes