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

Hon*_*gli 18 gdb

我的代码中似乎有一些多线程错误,每30次运行一次测试套件就会崩溃一次.测试套件是非交互式的.我想在gdb中运行我的测试套件,并且如果程序正常退出则正常退出gdb,如果崩溃则中断(并显示调试提示).这样我可以让测试套件反复运行,去拿一杯咖啡,回来,并提供一个很好的调试提示.我怎么能用gdb做到这一点?

acm*_*acm 22

这有点hacky但你可以这样做:

gdb -ex='set confirm on' -ex=run -ex=quit --args ./a.out
Run Code Online (Sandbox Code Playgroud)

如果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) 
Run Code Online (Sandbox Code Playgroud)

就像我说的那样,不漂亮,但只要你没有切换出一个活动进程退出的提示,它就可以了.可能还有一种使用gdb quit命令的方法:它接受一个数字参数,它是调试会话的退出代码.所以也许你可以使用--eval-command ="quit 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;
}
Run Code Online (Sandbox Code Playgroud)


Kev*_*vin 8

最简单的方法是使用以下提供的Python APIgdb:

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

 gdb.events.exited.connect(exit_handler)
Run Code Online (Sandbox Code Playgroud)

你甚至可以用一行来做:

(gdb) gdb.events.exited.connect(lambda x : gdb.execute("quit")
Run Code Online (Sandbox Code Playgroud)

您还可以检查返回代码,以确保它是您期望的"正常"代码event.exit_code.

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


sca*_*cai 5

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

gdb -return-child-result -ex run -ex "thread apply all bt" -ex "quit" --args myProgram -myProgramArg
Run Code Online (Sandbox Code Playgroud)

  • 这不是对这个特定问题的最佳答案,但对我的问题有很大帮助!谢谢,不知道`-return-child-result` (3认同)