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; его команды и выходные данные немного легче поддаются синтаксическому анализу, если вы расширите его, чтобы потребовались более продвинутые функции, как вы можете видеть в ранее связанной документации.
person
Sdaz MacSkibbons
schedule
18.09.2010