如果程序成功,如何让gdb退出,如果程序崩溃,如何中断?

如果程序成功,如何让gdb退出,如果程序崩溃,如何中断?,gdb,Gdb,我的代码中似乎存在某种多线程错误,使其测试套件每运行30次就会崩溃一次。测试套件是非交互式的。我想在gdb中运行我的测试套件,如果程序正常退出,则让gdb正常退出;如果程序崩溃,则中断(并显示调试提示)。这样我就可以让测试套件重复运行,去喝杯咖啡,然后回来,并得到一个很好的调试提示。如何使用gdb实现这一点?使其在崩溃时转储内核。如果您在linux上,请阅读man-core手册页,如果您正在运行bash,请阅读ulimitbuiltin 这样,当它崩溃时,您会发现一个很好的corefile,您可

我的代码中似乎存在某种多线程错误,使其测试套件每运行30次就会崩溃一次。测试套件是非交互式的。我想在gdb中运行我的测试套件,如果程序正常退出,则让gdb正常退出;如果程序崩溃,则中断(并显示调试提示)。这样我就可以让测试套件重复运行,去喝杯咖啡,然后回来,并得到一个很好的调试提示。如何使用gdb实现这一点?

使其在崩溃时转储内核。如果您在linux上,请阅读
man-core
手册页,如果您正在运行
bash
,请阅读
ulimit
builtin

这样,当它崩溃时,您会发现一个很好的corefile,您可以将其提供给gdb:

$ ulimit -c unlimited
$ ... run program ..., gopher coffee (or reddit ;)
$ gdb progname corefile

这是一个有点黑客,但你可以做:

gdb -ex='set confirm on' -ex=run -ex=quit --args ./a.out
如果a.out正常终止,它将使您退出GDB。但如果您崩溃,程序仍将处于活动状态,因此如果您真的想使用活动状态退出,GDB通常会提示:

Program received signal SIGABRT, Aborted.
0x00007ffff72dad05 in raise (sig=...) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
    in ../nptl/sysdeps/unix/sysv/linux/raise.c
A debugging session is active.

    Inferior 1 [process 15126] will be killed.

Quit anyway? (y or n) 
就像我说的,不漂亮,但它可以工作,只要你没有关闭提示退出一个活动的进程。可能还有一种方法可以使用gdb的
quit
命令:它接受一个数字参数,该参数是调试会话的退出代码。因此,也许您可以使用--eval command=“quit stuff”,其中stuff是一些GDB表达式,它反映了下级是否正在运行

此程序可用于测试:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    if (time(NULL) % 2) {
        raise(SIGINT);
    }
    puts("no crash");
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
int main(){
如果(时间(空)%2){
升起(SIGINT);
}
看跌期权(“无崩溃”);
返回退出成功;
}

当核心文件崩溃时,您是否没有得到它?像这样启动gdb“gdb-c核心”,并执行堆栈回溯


您更可能希望使用Valgrind。

最简单的方法是使用
gdb提供的:

 def exit_handler(event):
     gdb.execute("quit")

 gdb.events.exited.connect(exit_handler)
您甚至可以用一行代码来完成:

(gdb) gdb.events.exited.connect(lambda x : gdb.execute("quit")
您还可以检查返回代码,以确保它是
事件中预期的“正常”代码。退出\u code


您可以将它与@acm提到的
--eval command
--command
结合使用,以从命令行注册事件处理程序,或与
.gdbinit
文件一起使用

您还可以在程序崩溃时触发回溯,并让gdb以子进程的返回代码退出:

gdb -return-child-result -ex run -ex "thread apply all bt" -ex "quit" --args myProgram -myProgramArg

创建一个名为
.gdbinit
的文件,它将在启动gdb时使用

run
quit
无选项运行:

gdb --args prog arg1...

您正在告诉gdb运行并退出,但如果出现错误,它应该停止处理该文件。

如果您在
~/.gdbinit
文件中放入以下行,
gdb
将在程序退出时以0的状态代码退出

python

def exit_handler ( event ):
  if event .exit_code == 0:
    gdb .execute ( "quit" )

gdb .events .exited .connect ( exit_handler )

end

以上是对Kevin答案的改进。

我使用的是OS X Snow Leopard,这里的gdb不支持--eval命令,但我还是会选择你的答案。我认为如果你的
文件中有一个
设置confirm off
,这将不起作用。gdbinit
文件,gdb将始终返回…gdb--eval command=run--eval command=“set confirm off”--eval command=bt--eval command=quit--args./a.out这不是这个问题的最佳答案,但它对我的问题有很大帮助!谢谢,不知道
-返回子结果