From fc3127e8de6c2faf501defd9d172c3ec0e9d9928 Mon Sep 17 00:00:00 2001 From: Igor Canadi Date: Thu, 24 Apr 2014 13:52:20 -0400 Subject: [PATCH] Install stack trace handlers in unit tests Summary: Sometimes, our tests fail because of normal `assert` call. It would be helpful to see stack trace in that case, too. Test Plan: Added `assert(false)` and verified it prints out stack trace Reviewers: haobo, dhruba, sdong, ljin, yhchiang Reviewed By: haobo CC: leveldb Differential Revision: https://reviews.facebook.net/D18291 --- port/stack_trace.cc | 15 +++++++++++---- util/testharness.cc | 3 +++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/port/stack_trace.cc b/port/stack_trace.cc index 9222ba438b..b1a9ba08d8 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 85716cdae3..7051ccf669 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;