/// PrintCurStackTrace - Print the current stack trace to the specified stream. static void PrintCurStackTrace(raw_ostream &OS) { // Don't print an empty trace. if (PrettyStackTraceHead.get() == 0) return; // If there are pretty stack frames registered, walk and emit them. OS << "Stack dump:\n"; PrintStack(PrettyStackTraceHead.get(), OS); OS.flush(); }
PrettyStackTraceEntry::PrettyStackTraceEntry() { // The first time this is called, we register the crash printer. static bool HandlerRegistered = RegisterCrashPrinter(); (void)HandlerRegistered; // Link ourselves. NextEntry = PrettyStackTraceHead.get(); PrettyStackTraceHead.set(this); }
void CrashRecoveryContext::Disable() { sys::ScopedLock L(*gCrashRecoveryContextMutex); if (!gCrashRecoveryEnabled) return; gCrashRecoveryEnabled = false; PVOID currentHandle = const_cast<PVOID>(sCurrentExceptionHandle.get()); if (currentHandle) { // Now we can remove the vectored exception handler from the chain ::RemoveVectoredExceptionHandler(currentHandle); // Reset the handle in our thread-local set. sCurrentExceptionHandle.set(NULL); } }
bool CrashRecoveryContext::isRecoveringFromCrash() { return tlIsRecoveringFromCrash.get() != 0; }
PrettyStackTraceEntry::~PrettyStackTraceEntry() { assert(PrettyStackTraceHead.get() == this && "Pretty stack trace entry destruction is out of order"); PrettyStackTraceHead.set(getNextEntry()); }