GDB ha un "linguaggio" diverso per interagire con i programmi automatizzati chiamato GDB/MI (dettagliato here) , ma sfortunatamente, non sembra che supporti i condizionali, e dovrebbe funzionare da altri programmi con analisi e ramificazioni. Così, sembra che aspettare è il più facile (o almeno un lavoro) Soluzione:
$ cat gdbrunner
#!/usr/bin/expect -f
#spawn gdb -return-child-result --args ./mkfs.cpfs /dev/loop0
spawn gdb -return-child-result --args [lindex $argv 0]
#send "start\n"
#send "b cpfs_log if level >= WARNING"
send "run\n"
expect {
normally\. { send "quit\n" }
"exited with code" { interact -nobuffer }
}
Ho provato questo con i programmi semplici:
$ cat prog1.c
int main(void) { return 0; }
$ cat prog2.c
int main(void) { return 1; }
con i seguenti risultati:
$ ./gdbrunner ./prog1
spawn gdb -return-child-result --args ./prog1
run
(gdb) run
Starting program: /home/foo/prog1
Program exited normally.
(gdb) quit
$ ./gdbrunner ./prog2
spawn gdb -return-child-result --args ./prog2
run
(gdb) run
Starting program: /home/foo/prog2
Program exited with code 01.
(gdb)
In sostanza, è necessario analizzare l'output e il ramo utilizzando qualcos'altro. Ciò naturalmente funzionerebbe con qualsiasi altro programma in grado di gestire input/output di un altro processo, ma lo script previsto sopra dovrebbe iniziare, se non ti dispiace Tcl. Dovrebbe essere un po 'migliore, e aspettarsi il primo prompt (gdb), ma funziona grazie allo stdin buffering.
È inoltre possibile modificarlo per utilizzare tale interfaccia GDB/MI con l'argomento della riga di comando -i su GDB; i suoi comandi e output sono un po 'più facilmente analizzabili, se ti espanderai per aver bisogno di funzionalità più avanzate, come puoi vedere nella documentazione precedentemente collegata.
fonte
2010-09-18 08:34:43
C'è una domanda duplicato StackOverflow con una risposta utile: http: // StackOverflow.it/a/8657833/431087 –