成功终止后自动退出gdb?

时间:2010-09-18 07:24:18

标签: c linux gdb ubuntu-10.04

我使用调试脚本,该脚本与调试器一起连续运行多个相关进程。我目前正在使用-x自动执行多个命令(例如run)。 如何在调试过程成功终止时自动退出gdb?在命令文件中添加quit命令将导致该命令不仅在成功终止时处理,而且在发生错误时也(当我宁愿接管那个时候)。

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

+ gdb -return-child-result -x gdbbatch --args ./mkfs.cpfs /dev/loop0
GNU gdb (GDB) 7.1-ubuntu
Reading symbols from /home/matt/cpfs/mkfs.cpfs...done.

Program exited normally.
Breakpoint 2 at 0x805224f: file log.c, line 32.
(gdb)

gdbbatch的内容:

start
b cpfs_log if level >= WARNING

3 个答案:

答案 0 :(得分:11)

程序成功终止时,

gdb设置$_exitcode。你可以利用它 - 在脚本开头设置一个不太可能的值,如果它已经改变,最后只设置quit

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

(将$_exitcode设置为不太可能的值有点难看,但如果程序没有终止则根本不会定义它,并且似乎没有任何明显的方式询问“是这个变量定义的吗?“在条件中。”

答案 1 :(得分:9)

我认为我找到了一个完整的解决方案,可以在How to make gdb send an external notification on receiving a signal?中寻找类似的内容。这里的其他人似乎都没有提到或发现gdb hooks

根据Matthew关于$ _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

答案 2 :(得分:4)

GDB与称为GDB / MI的自动程序(详细here)有不同的“语言”,但不幸的是,它看起来不像是支持条件,并且预计会从其他程序运行解析和分支。因此,看起来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接口和GDB的-i命令行参数;如果您需要扩展以需要更多高级功能,它的命令和输出可以更容易解析,正如您在之前链接的文档中所看到的那样。