static LONG WINAPI exception_filter (LPEXCEPTION_POINTERS info) { struct output_buffer ob; SYSTEMTIME timeInfo; OSVERSIONINFOEX osInfo; FILE* crash; const char* dumpFile = "crashdump.txt"; int ret; GetSystemTime(&timeInfo); OBJZERO(osInfo); osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (!GetVersionEx((OSVERSIONINFO*)&osInfo)) { osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*)&osInfo); } output_init(&ob, g_output, BUFFER_MAX); if (!SymInitialize(GetCurrentProcess(), 0, TRUE)) { output_print(&ob, "Failed to init symbol context\n"); } else { struct bfd_set *set = (struct bfd_set *)calloc(1, sizeof(*set)); bfd_init(); _backtrace(&ob, set, 128, info->ContextRecord); release_set(set); SymCleanup(GetCurrentProcess()); } crash = fopen(dumpFile, "w"); if (crash != nullptr) { fprintf(crash, "======start======\n"); fprintf(crash, "Date: %.4d-%.2d-%.2d\n", timeInfo.wYear, timeInfo.wMonth, timeInfo.wDay); fprintf(crash, "Windows version %lu.%lu (Build %lu) %s\n", osInfo.dwMajorVersion, osInfo.dwMinorVersion, osInfo.dwBuildNumber, osInfo.szCSDVersion); fprintf(crash, BUILDSTRING ", cpu: " CPUSTRING ", version: " UFO_VERSION "\n\n"); fprintf(crash, "%s", g_output); fprintf(crash, "======end========\n"); fclose(crash); } fputs(g_output, stderr); ret = MessageBox(nullptr, "Would you like to upload this crash dump and your ufoconsole.log? This will help the developers to fix the problem.", GAME_TITLE_LONG" Fatal Error", MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2); if (ret == IDYES) Com_UploadCrashDump(dumpFile); return 0; }
static LONG WINAPI exception_filter(LPEXCEPTION_POINTERS info) { struct output_buffer ob; output_init(&ob, g_output, BUFFER_MAX); if (!SymInitialize(GetCurrentProcess(), 0, TRUE)) { output_print(&ob,"Failed to init symbol context\n"); } else { bfd_init(); struct bfd_set *set = calloc(1,sizeof(*set)); _backtrace(&ob , set , 128 , info->ContextRecord); release_set(set); SymCleanup(GetCurrentProcess()); } fputs(g_output , stderr); exit(1); return 0; }
LONG WINAPI exceptionFilter(LPEXCEPTION_POINTERS info) { if (g_output == NULL) { g_output = (char*) malloc(BUFFER_MAX); } struct output_buffer ob; output_init(&ob, g_output, BUFFER_MAX); if (!SymInitialize(GetCurrentProcess(), 0, TRUE)) { output_print(&ob,"Failed to init symbol context\n"); } else { bfd_init(); struct bfd_set *set = (bfd_set*)calloc(1,sizeof(*set)); _backtrace(&ob , set , 128 , info->ContextRecord); release_set(set); SymCleanup(GetCurrentProcess()); } // Dump a stack trace to a file. QFile stackTraceFile; stackTraceFile.setFileName(QString("%1/openmodelica.stacktrace.%2").arg(OpenModelica::tempDirectory()).arg(Helper::OMCServerName)); if (stackTraceFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&stackTraceFile); out.setCodec(Helper::utf8.toStdString().data()); out.setGenerateByteOrderMark(false); out << g_output; out.flush(); stackTraceFile.close(); } CrashReportDialog *pCrashReportDialog = new CrashReportDialog; pCrashReportDialog->exec(); exit(1); }