Come posso eseguire un programma con argomenti a riga di comando usando GDB all'interno di uno script Bash?


429

Quando si esegue un programma su GDB, di solito, gli argomenti per il programma vengono forniti al runcomando. C'è un modo per eseguire il programma utilizzando GDB e oltre a fornire argomenti all'interno di uno script di shell?

Ho visto una risposta in una domanda correlata, menzionando che possiamo collegare GDB al programma dopo che lo script ha iniziato l'esecuzione. Ma poi dovrò "aspettare" il programma.

c'è un altro modo per fare ciò?


Risposte:


613

Puoi eseguire gdb con il parametro --args,

gdb --args executablename arg1 arg2 arg3

Se vuoi che venga eseguito automaticamente, inserisci alcuni comandi in un file (ad es. 'Run') e forniscilo come argomento: -x / tmp / cmds. Opzionalmente è possibile eseguire con la modalità -batch.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3

53
Argg, man gdbnon contiene --args, ecco perché non l'ho trovato. gdb --helplo fa.
Ciro Santilli 15 冠状 病 六四 事件 法轮功

1
@CiroSantilli 事件 改造 中心 法轮功 六四 事件 GDB è GNU. Per visualizzare la documentazione completa degli strumenti GNU, ricordati di usare la info gdbprossima volta :-).
Apteryx,

1
@Apteryx forse un giorno imparerò info. Se Google o Stack Overflow smette di funzionare XD
Ciro Santilli 15 冠状 病 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Sono stato agganciato alle informazioni dopo aver scoperto il tasto 'i' ( index-search). Prova info gdb:, poi 'i', poi '--args'. Ti porterà subito.
Apteryx,

140
gdb -ex=r --args myprogram arg1 arg2

-ex=rè l'abbreviazione di -ex=rune dice a gdb di eseguire immediatamente il programma, piuttosto che aspettare che tu digiti "esegui" al prompt. Quindi --argsdice che tutto ciò che segue è il comando e gli argomenti, proprio come li digiteresti normalmente al prompt dei comandi.


Non sapevo -exe=rdell'utilissimo!
Jeef

46

Un altro modo per farlo, che trovo personalmente leggermente più comodo e intuitivo (senza dover ricordare il --argsparametro), è compilare normalmente e utilizzare r arg1 arg2 arg3direttamente dall'interno gdb, in questo modo:

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

23
Questo è esattamente ciò che l'OP spera di evitare di dover fare.
KarateSnowMachine

6
Hmmm, sì, grazie, punto giusto. Non sono sicuro di come sia sfuggito al mio avviso per così tanto tempo. Penso che lascerò la risposta qui, tuttavia, perché iirc, mi sono imbattuto in questa domanda quando ho cercato su Google qualcosa come "Come passare argomenti da riga di comando usando gdb", e trovando la risposta mancante, ho continuato ad aggiungerla , senza rendermi conto (per quasi un anno!) che la mia risposta non ha affrontato la domanda attuale.
aspiring_sarge

2
@KarateSnowMachine Come qualcuno che arriva anche da Google, questa risposta è più in linea con ciò che stavo cercando. Forse dovremmo rivedere la domanda per essere più generale poiché ha un titolo così generale, o forse dovremmo restringere il titolo. Renderlo meno restrittivo sarebbe probabilmente più utile per il maggior numero di lettori.
jpmc26,

18

È possibile creare un file con contesto:

run arg1 arg2 arg3 etc

program input

E chiama gdb come

gdb prog < file

4

gdb ha --init-command <somefile>dove somefile ha un elenco di comandi gdb da eseguire, lo uso per avere //GDBcommenti nel mio codice, quindi `

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

come uno script, che inserisce il comando per caricare i simboli di debug e quindi genera un elenco di comandi di interruzione per inserire un punto di interruzione per ciascun //GDBcommento e lo avvia in esecuzione


4

Se il --argsparametro non funziona sul tuo computer (ad es. Su Solaris 8), puoi avviare gdb come

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

E puoi combinare questo con l'inserimento di un file in stdin e "l'esecuzione immediata":

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

2

Oltre alla risposta di Hugo Ideler. Quando usavo argomenti con prefisso come --o -, non ero sicuro di entrare in conflitto con gdb one.

Sembra che gdb prenda tutto dopo args opzioni come argomenti per il programma.

All'inizio volevo essere sicuro, ho eseguito gdb con le virgolette intorno ai tuoi argomenti, è stato rimosso al lancio.

Anche questo funziona, ma facoltativo:

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

Questo non funziona:

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

In tal caso, -tuiviene utilizzato come parametro del mio programma e non come gdb.


1

Troppo tardi, ma ecco un metodo che funziona durante la gdbsessione.

gdb <executable>

poi

(gdb) apropos argument

Ciò restituirà molte partite, quella utile è set args.

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

set args arg1 arg2 ...

poi

r

Questo eseguirà il programma, passando a main (argc, argv) gli argomenti e il conteggio degli argomenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.