Wie führe ich ein Programm mit Befehlszeilenargumenten mit GDB in einem Bash-Skript aus?

428

Wenn Sie ein Programm auf GDB ausführen, werden normalerweise die Argumente für das Programm im runBefehl angegeben. Gibt es eine Möglichkeit, das Programm mit GDB auszuführen und Argumente in einem Shell-Skript anzugeben?

In einer verwandten Frage sah ich eine Antwort, in der erwähnt wurde, dass wir GDB an das Programm anhängen können, nachdem das Skript ausgeführt wurde. Aber dann muss ich das Programm abwarten.

Gibt es einen anderen Weg, dies zu tun?

drox
quelle
2
Mögliches Duplikat von Wie werden Argumente übergeben und stdin von einer Datei an ein in gdb ausgeführtes Programm umgeleitet?
Ciro Santilli 法轮功 冠状 病 六四 事件 15

Antworten:

612

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 im Batch-Modus arbeiten.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
Hugo Ideler
quelle
53
Argg, man gdbenthält nicht --args, deshalb habe ich es nicht gefunden. gdb --helptut.
Ciro Santilli 法轮功 冠状 病 六四 事件 15
1
@CiroSantilli B 改造 中心. 法轮功 事件 GDB ist GNU. info gdbDenken Sie daran, das nächste Mal zu verwenden, um die vollständige Dokumentation der GNU-Tools anzuzeigen :-).
Apteryx
1
@ Apteryx vielleicht werde ich eines Tages lernen info. Wenn Google oder Stack Overflow nicht mehr funktionieren XD
Ciro Santilli 15 冠状 病 病 六四
1
@CiroSantilli after 改造 中心 法轮功 六四 事件 Nachdem ich den 'i'-Schlüssel ( index-search) entdeckt hatte, war ich von Informationen begeistert . Versuchen Sie: info gdbdann 'i', dann '--args'. Es wird dich direkt dazu bringen.
Apteryx
138
gdb -ex=r --args myprogram arg1 arg2

-ex=rist -ex=rundie Abkürzung für und weist gdb an, Ihr Programm sofort auszuführen, anstatt darauf zu warten, dass Sie an der Eingabeaufforderung "run" eingeben. Dann --argsheißt es, dass alles, was folgt, der Befehl und die Argumente sind, so wie Sie sie normalerweise an der Eingabeaufforderung eingeben würden.

Hugo
quelle
Wusste nichts über das -exe=rsehr Nützliche!
Jeef
46

Eine andere Möglichkeit, die ich persönlich etwas bequemer und intuitiver finde (ohne mich an den --argsParameter erinnern zu müssen ), besteht darin, normal zu kompilieren und r arg1 arg2 arg3direkt von innen zu verwenden gdb, wie folgt :

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
aspiring_sarge
quelle
23
Genau das hofft das OP zu vermeiden.
KarateSnowMachine
6
Hmmm, ja, danke, fairer Punkt. Ich bin mir nicht sicher, wie mir das so lange entgangen ist. Ich denke, ich werde die Antwort hier lassen, da ich auf diese Frage gestoßen bin, als ich etwas wie "Wie man Befehlszeilenargumente mit gdb übergibt" gegoogelt hatte und die Antwort fehlte, fügte ich sie hinzu , ohne zu bemerken (fast ein Jahr lang!), dass meine Antwort die vorliegende Frage nicht ansprach.
aspiring_sarge
2
@KarateSnowMachine Als jemand, der ebenfalls von Google ankommt, entspricht diese Antwort eher dem, wonach ich gesucht habe. Vielleicht sollten wir die Frage allgemeiner überarbeiten, da sie einen so allgemeinen Titel hat, oder vielleicht sollten wir den Titel eingrenzen. Eine geringere Einschränkung wäre für die größere Anzahl von Lesern wahrscheinlich nützlicher.
jpmc26
18

Sie können eine Datei mit Kontext erstellen:

run arg1 arg2 arg3 etc

program input

Und gdb wie nennen

gdb prog < file
George Kastrinis
quelle
4

gdb hat, --init-command <somefile>wo somefile eine Liste von gdb-Befehlen zum Ausführen hat. Ich benutze dies, um //GDBKommentare 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 setzt und dann eine Liste von Unterbrechungsbefehlen generiert, um für jeden //GDBKommentar einen Haltepunkt zu setzen , und ihn startet

Austin_Anderson
quelle
4

Wenn der --argsParameter auf Ihrem Computer (dh unter Solaris 8) nicht funktioniert, können Sie gdb like starten

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

Und Sie können dies mit der Eingabe einer Datei in stdin und "sofort laufen" kombinieren:

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

Neben der Antwort von Hugo Ideler. Bei der Verwendung von Argumenten mit einem Präfix wie --oder -war ich mir nicht sicher, ob ich mit gdb one in Konflikt geraten könnte.

Es scheint, dass gdb all after argsoption als Argumente für das Programm verwendet.

Zuerst wollte ich sicher sein, dass ich gdb mit Anführungszeichen um Ihre Argumente ausgeführt habe. Es wird beim Start entfernt.

Dies funktioniert auch, ist aber optional:

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

Das funktioniert nicht:

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

In diesem Fall -tuiwird als mein Programmparameter nicht als gdb eins verwendet.

Sandburg
quelle
1

Viel zu spät, aber hier ist eine Methode, die während der gdbSitzung funktioniert .

gdb <executable>

dann

(gdb) apropos argument

Dies wird viele Übereinstimmungen zurückgeben, die nützliche ist set args.

set args -- Set argument list to give program being debugged when it is started.

set args arg1 arg2 ...

dann

r

Dadurch wird das Programm ausgeführt und die Argumente und die Anzahl der Argumente an main (argc, argv) übergeben.

Alinsoar
quelle