void InstallCrashHandler(const TCHAR *crashDumpPath, const TCHAR *symDir) { assert(!gDumpEvent && !gDumpThread); if (!crashDumpPath) return; if (!StoreCrashDumpPaths(symDir)) return; if (!BuildSymbolPath()) return; BuildSystemInfo(); // at this point list of modules should be complete (except // dbghlp.dll which shouldn't be loaded yet) BuildModulesInfo(); gExeType = DetectExeType(); // we pre-allocate as much as possible to minimize allocations // when crash handler is invoked. It's ok to use standard // allocation functions here. gCrashHandlerAllocator = new CrashHandlerAllocator(); gCrashDumpPath = str::Dup(crashDumpPath); gAdditionalInfo = new str::Str<char>(4096); gDumpEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (!gDumpEvent) return; gDumpThread = CreateThread(NULL, 0, CrashDumpThread, NULL, 0, 0); if (!gDumpThread) return; gPrevExceptionFilter = SetUnhandledExceptionFilter(DumpExceptionHandler); }
void InstallCrashHandler(const WCHAR *crashDumpPath, const WCHAR *symDir) { assert(!gDumpEvent && !gDumpThread); if (!crashDumpPath) return; if (!StoreCrashDumpPaths(symDir)) return; if (!BuildSymbolPath()) return; // don't bother sending crash reports when running under Wine // as they're not helpful bool isWine= BuildModulesInfo(); if (isWine) return; BuildSystemInfo(); // at this point list of modules should be complete (except // dbghlp.dll which shouldn't be loaded yet) gExeType = DetectExeType(); // we pre-allocate as much as possible to minimize allocations // when crash handler is invoked. It's ok to use standard // allocation functions here. gCrashHandlerAllocator = new CrashHandlerAllocator(); gSymbolsUrl = BuildSymbolsUrl(); gCrashDumpPath = str::Dup(crashDumpPath); gDumpEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); if (!gDumpEvent) return; gDumpThread = CreateThread(nullptr, 0, CrashDumpThread, nullptr, 0, 0); if (!gDumpThread) return; gPrevExceptionFilter = SetUnhandledExceptionFilter(DumpExceptionHandler); signal(SIGABRT, onSignalAbort); #if defined(_MSC_VER) // those are only in msvc? There is std::set_terminate() and // std::set_unexpected() in C++ in <exception> std::set_terminate(onTerminate); std::set_unexpected(onUnexpected); #endif }