Это немного хакерски, но вы могли бы сделать:
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;
}