From 280f9c939df526cca97b025bca405fb495db474d Mon Sep 17 00:00:00 2001 From: Alkis Evlogimenos Date: Thu, 19 Feb 2004 07:36:35 +0000 Subject: Print stacktrace in STDERR before dying on a fatal signal. Currently the symbols are not demangled. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11620 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Signals.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib/Support/Signals.cpp') diff --git a/lib/Support/Signals.cpp b/lib/Support/Signals.cpp index 27e3eb80e5..03482f9512 100644 --- a/lib/Support/Signals.cpp +++ b/lib/Support/Signals.cpp @@ -17,7 +17,9 @@ #include #include #include +#include #include +#include #include "Config/config.h" // Get the signal handler return type using namespace llvm; @@ -39,6 +41,7 @@ static const int KillSigs[] = { }; static const int *KillSigsEnd = KillSigs + sizeof(KillSigs)/sizeof(KillSigs[0]); +static void* StackTrace[256]; // SignalHandler - The signal handler that runs... static RETSIGTYPE SignalHandler(int Sig) { @@ -50,7 +53,10 @@ static RETSIGTYPE SignalHandler(int Sig) { if (std::find(IntSigs, IntSigsEnd, Sig) != IntSigsEnd) exit(1); // If this is an interrupt signal, exit the program - // Otherwise if it is a fault (like SEGV) reissue the signal to die... + // Otherwise if it is a fault (like SEGV) output the stacktrace to + // STDERR and reissue the signal to die... + int depth = backtrace(StackTrace, sizeof(StackTrace)/sizeof(StackTrace[0])); + backtrace_symbols_fd(StackTrace, depth, STDERR_FILENO); signal(Sig, SIG_DFL); } -- cgit v1.2.3