GDB имеет другой «язык» для взаимодействия с автоматизированными программами, называемый GDB / MI (подробное описание здесь ), но, к сожалению, он не выглядит так, как будто он поддерживает условные выражения и, как ожидается, будет запущен из программы с разбором и ветвлением. Итак, похоже, что Expect - самое простое (или хотя бы работающее) решение:
$ 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 }
}
Я проверил это с помощью простых программ:
$ cat prog1.c
int main(void) { return 0; }
$ cat prog2.c
int main(void) { return 1; }
Со следующими результатами:
$ ./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)
По сути, вы должны проанализировать вывод и ответвление, используя что-то еще. Это, конечно, будет работать с любой другой программой, способной обрабатывать ввод / вывод другого процесса, но приведенный выше сценарий ожидаемого запуска должен помочь вам начать работу, если вы не возражаете против Tcl. Должно быть немного лучше и ожидать первого (gdb) приглашения, но оно работает из-за буферизации stdin.
Вы также можете изменить его, чтобы использовать этот интерфейс GDB / MI с аргументом командной строки -i для GDB; его команды и выходные данные более легко разбираются, если вы будете расширяться, чтобы нуждаться в более сложных функциях, как вы можете видеть в ранее связанной документации.