diff --git a/port/stack_trace.cc b/port/stack_trace.cc index 9222ba438..b1a9ba08d 100644 --- a/port/stack_trace.cc +++ b/port/stack_trace.cc @@ -23,6 +23,7 @@ void PrintStack(int first_frames_to_skip) {} #include #include #include +#include namespace { @@ -69,9 +70,17 @@ void PrintStackTraceLine(const char* symbol, void* frame) { #elif OS_MACOSX void PrintStackTraceLine(const char* symbol, void* frame) { - // TODO(icanadi) demangle if (symbol) { - fprintf(stderr, "%s ", symbol); + char filename[64], function[512], plus[2], line[10]; + sscanf(symbol, "%*s %64s %*s %512s %2s %10s", filename, function, plus, + line); + int status; + char* demangled = abi::__cxa_demangle(function, 0, 0, &status); + fprintf(stderr, "%s %s %s %s", filename, + (status == 0) ? demangled : function, plus, line); + if (demangled) { + free(demangled); + } } fprintf(stderr, " %p", frame); fprintf(stderr, "\n"); @@ -111,8 +120,6 @@ void InstallStackTraceHandler() { signal(SIGSEGV, StackTraceHandler); signal(SIGBUS, StackTraceHandler); signal(SIGABRT, StackTraceHandler); - - printf("Installed stack trace handler for SIGILL SIGSEGV SIGBUS SIGABRT\n"); } #endif diff --git a/util/testharness.cc b/util/testharness.cc index 85716cdae..7051ccf66 100644 --- a/util/testharness.cc +++ b/util/testharness.cc @@ -8,6 +8,7 @@ // found in the LICENSE file. See the AUTHORS file for names of contributors. #include "util/testharness.h" +#include "port/stack_trace.h" #include #include @@ -39,6 +40,8 @@ bool RegisterTest(const char* base, const char* name, void (*func)()) { } int RunAllTests() { + port::InstallStackTraceHandler(); + const char* matcher = getenv("ROCKSDB_TESTS"); int num = 0;