From 9a6b3e39e58e761bdc5b23af19378efb023e1dac Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Wed, 18 Oct 2017 09:08:51 -0700 Subject: [PATCH] Fix demangle of function names. Also move the Backtrace::CreateNew function into the same place as ::Create in preparation for the switch to the new unwinder as the base. Test: Verify that names are demangled properly. Change-Id: I6274cd43ea52210523e1e1ce23af5b22f62f4573 --- libbacktrace/Backtrace.cpp | 32 +++++++++++++++++++++++++++++++- libbacktrace/UnwindStack.cpp | 31 +------------------------------ 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/libbacktrace/Backtrace.cpp b/libbacktrace/Backtrace.cpp index 81f5e32cc..afe518c5b 100644 --- a/libbacktrace/Backtrace.cpp +++ b/libbacktrace/Backtrace.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include #include #include #include @@ -30,9 +31,10 @@ #include #include "BacktraceLog.h" -#include "thread_utils.h" #include "UnwindCurrent.h" #include "UnwindPtrace.h" +#include "UnwindStack.h" +#include "thread_utils.h" using android::base::StringPrintf; @@ -140,6 +142,34 @@ Backtrace* Backtrace::Create(pid_t pid, pid_t tid, BacktraceMap* map) { } } +Backtrace* Backtrace::CreateNew(pid_t pid, pid_t tid, BacktraceMap* map) { + if (pid == BACKTRACE_CURRENT_PROCESS) { + pid = getpid(); + if (tid == BACKTRACE_CURRENT_THREAD) { + tid = gettid(); + } + } else if (tid == BACKTRACE_CURRENT_THREAD) { + tid = pid; + } + + if (map == nullptr) { +// This would cause the wrong type of map object to be created, so disallow. +#if defined(__ANDROID__) + __assert2(__FILE__, __LINE__, __PRETTY_FUNCTION__, + "Backtrace::CreateNew() must be called with a real map pointer."); +#else + BACK_LOGE("Backtrace::CreateNew() must be called with a real map pointer."); + abort(); +#endif + } + + if (pid == getpid()) { + return new UnwindStackCurrent(pid, tid, map); + } else { + return new UnwindStackPtrace(pid, tid, map); + } +} + std::string Backtrace::GetErrorString(BacktraceUnwindError error) { switch (error) { case BACKTRACE_UNWIND_NO_ERROR: diff --git a/libbacktrace/UnwindStack.cpp b/libbacktrace/UnwindStack.cpp index 41153ce19..73bfdec1e 100644 --- a/libbacktrace/UnwindStack.cpp +++ b/libbacktrace/UnwindStack.cpp @@ -15,7 +15,6 @@ */ #define _GNU_SOURCE 1 -#include #include #include #include @@ -93,7 +92,7 @@ static bool Unwind(unwindstack::Regs* regs, BacktraceMap* back_map, back_frame->pc = frame->pc; back_frame->sp = frame->sp; - back_frame->func_name = frame->function_name; + back_frame->func_name = demangle(frame->function_name.c_str()); back_frame->func_offset = frame->function_offset; back_frame->map.name = frame->map_name; @@ -149,31 +148,3 @@ bool UnwindStackPtrace::Unwind(size_t num_ignore_frames, ucontext_t* context) { error_ = BACKTRACE_UNWIND_NO_ERROR; return ::Unwind(regs.get(), GetMap(), &frames_, num_ignore_frames); } - -Backtrace* Backtrace::CreateNew(pid_t pid, pid_t tid, BacktraceMap* map) { - if (pid == BACKTRACE_CURRENT_PROCESS) { - pid = getpid(); - if (tid == BACKTRACE_CURRENT_THREAD) { - tid = gettid(); - } - } else if (tid == BACKTRACE_CURRENT_THREAD) { - tid = pid; - } - - if (map == nullptr) { -// This would cause the wrong type of map object to be created, so disallow. -#if defined(__ANDROID__) - __assert2(__FILE__, __LINE__, __PRETTY_FUNCTION__, - "Backtrace::CreateNew() must be called with a real map pointer."); -#else - BACK_LOGE("Backtrace::CreateNew() must be called with a real map pointer."); - abort(); -#endif - } - - if (pid == getpid()) { - return new UnwindStackCurrent(pid, tid, map); - } else { - return new UnwindStackPtrace(pid, tid, map); - } -}