diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index c04434347..0e921d73b 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -205,6 +205,21 @@ static char returnWadPath[256]; // TODO - move this to some header file instead extern struct backtrace_state *bt_state; +typedef struct bt_crash_reason_s { + enum { + BTCRASH_SIGNAL, + BTCRASH_ERRORMSG, + } type; + + union { + INT32 signal; + const char *errormsg; + } value; +} bt_crash_reason_t; + +#define BT_CRASH_REASON_SIGNAL(num) (bt_crash_reason_t){ .type = BTCRASH_SIGNAL, .value = { .signal = num } } +#define BT_CRASH_REASON_ERRORMSG(msg) (bt_crash_reason_t){ .type = BTCRASH_ERRORMSG, .value = { .errormsg = msg } } + static void printsignal(FILE *fp, INT32 num) { switch (num) @@ -295,7 +310,7 @@ static void bt_error_cb(void *data, const char *msg, int errnum) buf->error = true; } -static void write_backtrace(INT32 num) +static void write_backtrace(bt_crash_reason_t reason) { FILE *out = fopen(va("%s" PATHSEP "%s", srb2home, "srb2kart-crash-log.txt"), "a"); @@ -331,7 +346,17 @@ static void write_backtrace(INT32 num) fprintf(out, "Time of crash: %s\n", asctime(timeinfo)); fprintf(out, "Caused by: "); - printsignal(out, num); + + switch (reason.type) + { + case BTCRASH_SIGNAL: + printsignal(out, reason.value.signal); + break; + + case BTCRASH_ERRORMSG: + fprintf(out, "%s", reason.value.errormsg); + break; + } fprintf(out, "\nBacktrace:\n"); @@ -484,7 +509,7 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num) D_QuitNetGame(); // Fix server freezes #ifdef HAVE_LIBBACKTRACE - write_backtrace(num); + write_backtrace(BT_CRASH_REASON_SIGNAL(num)); #endif I_ReportSignal(num, 0); @@ -883,7 +908,7 @@ static void signal_handler_child(INT32 num) { #ifdef HAVE_LIBBACKTRACE - write_backtrace(num); + write_backtrace(BT_CRASH_REASON_SIGNAL(num)); #endif signal(num, SIG_DFL); //default signal action @@ -3508,6 +3533,11 @@ void I_Error(const char *error, ...) vsprintf(buffer, error, argptr); va_end(argptr); I_OutputMsg("\nI_Error(): %s\n", buffer); + +#ifdef HAVE_LIBBACKTRACE + write_backtrace(BT_CRASH_REASON_ERRORMSG(buffer)); +#endif + // --- I_ShutdownConsole();