In un primo momento, si può eseguire il programma ed eseguire il debug da pid. Questa soluzione, ovviamente, non copre tutti i casi.
Un altro approccio è utilizzare le funzionalità di Linux per la comunicazione tra processi. In breve, si reindirizza l'output di ret
in un file speciale FIFO ("named pipe") e quindi si legge dalla FIFO tramite il debugger. Ecco come è fatto. Da bash, eseguire:
mkfifo foo
Questo crea un file speciale nella directory che servirà come una pipa denominata . Quando scrivi del testo su questo file (usando la stessa sintassi echo "Hello" >foo
), il programma di scrittura bloccherà fino a quando qualcuno non leggerà i dati dal file (cat <foo
, per esempio). Nel nostro caso, un file controllato da gdb leggerà da questo file.
Dopo aver creato una FIFO, eseguito da bash:
ret > foo & # ampersand because it may block as nobody is reading from foo
gdb blah
Poi, nel prompt di gdb, eseguire
run <foo
E ottenere l'effetto desiderato. Nota che non puoi leggere i dati dal fifo (come da una solita pipe) due volte: quando hai letto tutti i dati, il processo blah
muore e dovresti ripetere il comando scrivendo a foo (puoi farlo dall'altra finestra della shell).
Al termine, rimuovere il fifo con rm foo
(o inserirlo nella directory in cui verrà automaticamente rimosso al riavvio del sistema, ad esempio /tmp
).
fonte
2009-09-21 19:25:38
È diverso da: http://stackoverflow.com/questions/4521015/how-to-pass-arguments-and-redirect-stdin-from-a-file-to-program-run-in-gdb –