使成功终止gdb自动退出?

我使用一个debugging脚本连续运行几个相关的进程与debugging器。 我目前使用-x自动执行几个命令(如run )。 如何在debugging过程成功终止时自动退出gdb 向命令文件添加一个quit命令将导致该命令不仅在成功终止时被处理,而且还会在发生错误时(当时我宁愿接pipe)。

以下是正在发生的事情摘录:

  + gdb -return-child-result -x gdbbatch --args ./mkfs.cpfs / dev / loop0
 GNU gdb(GDB)7.1-ubuntu
读取/home/matt/cpfs/mkfs.cpfs...done中的符号。

程序正常退出。
断点2在0x805224f:文件log.c,第32行。
 (GDB) 

gdbbatch内容:

 开始
 b cpfs_log如果级别> =警告 

Solutions Collecting From Web of "使成功终止gdb自动退出?"

当程序成功终止时,gdb设置$_exitcode 。 你可以使用它 – 在你的脚本开始时把它设置成一个不太可能的值,并且如果它改变了的话只在最后quit

 set $_exitcode = -999 # ... run # ... if $_exitcode != -999 quit end 

(将$_exitcode设置$_exitcode一个不太可能的值有点难看,但是如果程序没有终止,它将不会被定义,并且似乎没有任何显而易见的方式来询问“是否定义了这个变量?在条件。)

我想我已经找到了一个完整的解决方案,你的问题在寻找类似的东西如何使gdb发送一个外部通知接收信号? 。 这里没有其他人似乎提到或发现gdb挂钩 。

基于马修的关于$ _exitcode的提示,这是现在我的app / .gdbinit实现了完全想要的行为; 正常退出成功终止,并下降到gdb提示,发送电子邮件,什么都不是:

 set $_exitcode = -999 set height 0 handle SIGTERM nostop print pass handle SIGPIPE nostop define hook-stop if $_exitcode != -999 quit else shell echo | mail -s "NOTICE: app has stopped on unhandled signal" root end end echo .gdbinit: running app\n run 

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命令行参数; 它的命令和输出更容易解析,如果你将扩展到需要更高级的功能,你可以在前面链接的文档中看到。