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)提示,但由于标准输入缓冲而起作用。
您还可以修改它以使用 GDB/MI 接口和 GDB 的 -i 命令行参数;它的命令和输出更容易解析,如果您将扩展以需要更多高级功能,如您在先前链接的文档中所见。