If have libbacktrace, write crash reports from I_Error #101

Merged
alufolie91 merged 1 commits from ierror-crash-log into Saturn-Next 2024-02-12 07:33:48 +01:00
+34 -4
View File
@@ -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();