BGF tiene un "lenguaje" diferente para interactuar con programas automatizados llamada GDB/MI (detallado here) , pero desafortunadamente, no parece que admita condiciones, y se espera que se ejecute desde otros programas con análisis y bifurcación. Por lo tanto, parece que esperar es la solución más fácil (o al menos una de trabajo):
$ 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 }
}
He probado esto con los programas simples:
$ cat prog1.c
int main(void) { return 0; }
$ cat prog2.c
int main(void) { return 1; }
con los siguientes resultados:
$ ./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)
Básicamente, tiene que analizar el resultado y bifurcar usando algo más. Esto, por supuesto, funcionaría con cualquier otro programa capaz de manejar la entrada/salida de otro proceso, pero la secuencia de comandos de arriba debe comenzar, si no le importa Tcl. Debería ser un poco mejor y esperar el primer aviso (gdb), pero funciona debido al almacenamiento temporal stdin.
También puede modificarlo para usar esa interfaz GDB/MI con el argumento de línea de comandos -i para GDB; sus comandos y resultados son un poco más fáciles de analizar, si se expande para necesitar funciones más avanzadas, como puede ver en la documentación vinculada anteriormente.
Hay una pregunta Stackoverflow duplicado con una respuesta útil: http: // stackoverflow.com/a/8657833/431087 –