If have libbacktrace, write crash reports from I_Error #101
+34
-4
@@ -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();
|
||||
|
||||
Reference in new issue
Block a user