on apple systems, integrate nicely with crash reporter.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66264 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-03-06 07:19:54 +00:00
parent 00e389c8c8
commit 49155ffaba

View File

@ -15,6 +15,7 @@
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/System/Signals.h"
#include "llvm/ADT/SmallString.h"
using namespace llvm;
// FIXME: This should be thread local when llvm supports threads.
@ -30,20 +31,49 @@ static unsigned PrintStack(const PrettyStackTraceEntry *Entry, raw_ostream &OS){
return NextID+1;
}
/// CrashHandler - This callback is run if a fatal signal is delivered to the
/// process, it prints the pretty stack trace.
static void CrashHandler(void *Cookie) {
/// PrintCurStackTrace - Print the current stack trace to the specified stream.
static void PrintCurStackTrace(raw_ostream &OS) {
// Don't print an empty trace.
if (PrettyStackTraceHead == 0) return;
// If there are pretty stack frames registered, walk and emit them.
raw_ostream &OS = errs();
OS << "Stack dump:\n";
PrintStack(PrettyStackTraceHead, OS);
OS.flush();
}
// Integrate with crash reporter.
#ifdef __APPLE__
extern "C" const char *__crashreporter_info__;
const char *__crashreporter_info__ = 0;
#endif
/// CrashHandler - This callback is run if a fatal signal is delivered to the
/// process, it prints the pretty stack trace.
static void CrashHandler(void *Cookie) {
#ifndef __APPLE__
// On non-apple systems, just emit the crash stack trace to stderr.
PrintCurStackTrace(errs());
#else
// Otherwise, emit to a smallvector of chars, send *that* to stderr, but also
// put it into __crashreporter_info__.
SmallString<2048> TmpStr;
{
raw_svector_ostream Stream(TmpStr);
PrintCurStackTrace(Stream);
}
if (!TmpStr.empty()) {
__crashreporter_info__ = strdup(&TmpStr[0]);
errs() << __crashreporter_info__;
errs().flush();
}
#endif
}
static bool RegisterCrashPrinter() {
sys::AddSignalHandler(CrashHandler, 0);
return false;