| @@ -16,12 +16,14 @@ | |||||
| #include <osdialog.h> | #include <osdialog.h> | ||||
| #include <unistd.h> // for getopt | #include <unistd.h> // for getopt | ||||
| #include <execinfo.h> // for backtrace and backtrace_symbols | |||||
| #include <signal.h> // for signal | #include <signal.h> // for signal | ||||
| #if defined ARCH_LIN | |||||
| #include <execinfo.h> // for backtrace and backtrace_symbols | |||||
| #endif | |||||
| #if defined ARCH_WIN | #if defined ARCH_WIN | ||||
| #include <Windows.h> | |||||
| #include <Windows.h> | |||||
| #endif | #endif | ||||
| using namespace rack; | using namespace rack; | ||||
| @@ -34,19 +36,40 @@ static void fatalSignalHandler(int sig) { | |||||
| exit(1); | exit(1); | ||||
| caught = true; | caught = true; | ||||
| const int bufferLen = 128; | |||||
| void *buffer[bufferLen]; | |||||
| int size = backtrace(buffer, bufferLen); | |||||
| char **strings = backtrace_symbols(buffer, size); | |||||
| FATAL("Fatal signal %d. Backtrace:", sig); | FATAL("Fatal signal %d. Backtrace:", sig); | ||||
| FATAL(""); | FATAL(""); | ||||
| for (int i = 0; i < size; i++) | |||||
| FATAL("%s", strings[i]); | |||||
| osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack has crashed. See log.txt for details."); | |||||
| int stackLen = 128; | |||||
| void *stack[stackLen]; | |||||
| #if defined ARCH_LIN | |||||
| stackLen = backtrace(stack, stackLen); | |||||
| char **strings = backtrace_symbols(stack, stackLen); | |||||
| for (int i = 0; i < stackLen; i++) { | |||||
| FATAL("%d: %s", i, strings[i]); | |||||
| } | |||||
| free(strings); | free(strings); | ||||
| #elif defined ARCH_MAC | |||||
| // TODO | |||||
| #elif defined ARCH_WIN | |||||
| HANDLE process = GetCurrentProcess(); | |||||
| SymInitialize(process, NULL, true); | |||||
| stackLen = CaptureStackBackTrace(0, stackLen, stack, NULL); | |||||
| SYMBOL_INFO *symbol = (SYMBOL_INFO*) calloc(sizeof(SYMBOL_INFO) + 256, 1); | |||||
| symbol->MaxNameLen = 255; | |||||
| symbol->SizeOfStruct = sizeof(SYMBOL_INFO); | |||||
| for (int i = 0; i < stackLen; i++) { | |||||
| SymFromAddr(process, (DWORD64) stack[i], 0, symbol); | |||||
| FATAL("%d: %s 0x%0x", i, symbol->Name, symbol->Address); | |||||
| } | |||||
| free(symbol); | |||||
| #endif | |||||
| osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack has crashed. See log.txt for details."); | |||||
| exit(1); | exit(1); | ||||
| } | } | ||||