Come caricare il programma leggendo stdin e prendendo parametri in gdb?


101

Ho un programma che prende l'input da stdin e prende anche alcuni parametri dalla riga di comando. Assomiglia a questo:

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

Provo a fare il debug del codice con gdb all'interno di emacs, da Mx gdb, provo a caricare il programma con il comando:

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

Tuttavia, a gdb non piace.

Domanda cribbed da qui . Sfortunatamente non capisco la soluzione e non sono sicuro di cosa fare oltre alla compilazione con l' -gopzione e all'esecuzione del comando Mx gdb.

Risposte:


132

Se lo facessi da una shell, lo faresti in questo modo:

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

Questo sembra funzionare anche all'interno di emacs.


Il reindirizzamento sembra funzionare ma ottengo alcuni errori. Impossibile leggere un'immagine del file oggetto valido dalla memoria. Programma terminato con il codice 042. Qualche idea?
vinc456

Questo è probabilmente un errore generale di GDB e probabilmente non ha nulla a che fare con il fatto che stai eseguendo all'interno di emacs. Impara prima come eseguire GDB da una shell (con una nuova domanda se necessario) e poi preoccupati di eseguirlo all'interno di emacs.
Alnitak

1
L'avevo capito. Per qualche ragione ho digitato void main (int argc, char * argv []) invece di "int main ..." e mi è sfuggito l'occhio. Comunque tutto funziona bene adesso; Grazie per l'aiuto!
vinc456

2
Un ringraziamento tardivo: il manuale gdb è una seccatura da trascinare.
Cancellato il

1
Su Windows utilizzando msys64 ottengo <e input.txtcome argvargomenti al mio programma :( Terrò a scavare intorno a queste risposte con il mio gdb 8.2.1: stackoverflow.com/questions/3544325/...
ixe013

32

Ci sono molti modi per farlo:

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

o

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

o

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

dove il runcomando gdb ( r) utilizza di default gli argomenti impostati in precedenza con set args.


4
Quando provo questo con gdb in cygwin, non funziona. Il comando "show args" mostra che ho inserito gli argomenti che volevo, ma quando avvio il programma con "r", il programma aspetta che digiti qualcosa invece di leggere dal file specificato.
cardiff space man

1
@cardiffspaceman, beh, non posso testarlo con Cygwin - forse la loro versione gdb è in qualche modo limitata
maxschlepzig

Perché non semplicemente gdb -ex 'r -path /home/user/work < input.txt' myprogramnella terza variante?
Ruslan

@Ruslan, funziona anche - l'uso di 'set args ...' ti dà solo la possibilità di definire interattivamente alcuni punti di interruzione ecc. Prima di eseguire il programma
maxschlepzig

Vero, ma puoi anche impostare il punto di interruzione in modo non interattivo, ad es gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Ruslan

6

Per completezza, all'avvio di una sessione di debug c'è anche l'opzione --args. cioè)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3

14
Come reindirizzeresti input.txt come input a yourprog all'avvio di una sessione di debug come questa?
Peter Ajtai

1
@Peter:gdb --args yourprog.out input.txt
Ben Elgar

1
Funziona solo se "yourprog" si aspetta un nome file per specificare l'input, non il reindirizzamento dell'input.
Alnitak

0

E se non è necessario eseguire il debug dall'inizio, è anche possibile collegarsi a un processo già in esecuzione utilizzando:

$ gdb myprogram xxx

dove xxx è l'id del processo. Quindi non è necessario indicare a gdb gli argomenti iniziali.


4
Hai perso la risposta al titolo della domanda, nella parte "reading stdin". Farei un buon commento da qualche parte se fosse più breve.
elenco il
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.