From 4dea3b2b0df8539f605830ba9ed5967f0945a4af Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Fri, 25 Mar 2016 17:12:53 +0100 Subject: [PATCH] [mc] Demangle C++ names when unwinding the stack with abi::__cxa_demangle --- src/mc/mc_global.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/mc/mc_global.cpp b/src/mc/mc_global.cpp index 0d804882f7..73aefe7f37 100644 --- a/src/mc/mc_global.cpp +++ b/src/mc/mc_global.cpp @@ -9,6 +9,8 @@ #include #include +#include + #include #include "mc_base.h" @@ -270,16 +272,24 @@ void dumpStack(FILE* file, unw_cursor_t cursor) unw_word_t off; do { const char * name = !unw_get_proc_name(&cursor, buffer, 100, &off) ? buffer : "?"; + + int status; + + // Demangle C++ names: + char* realname = abi::__cxa_demangle(name, 0, 0, &status); + #if defined(__x86_64__) unw_word_t rip = 0; unw_word_t rsp = 0; unw_get_reg(&cursor, UNW_X86_64_RIP, &rip); unw_get_reg(&cursor, UNW_X86_64_RSP, &rsp); fprintf(file, " %i: %s (RIP=0x%" PRIx64 " RSP=0x%" PRIx64 ")\n", - nframe, name, (std::uint64_t) rip, (std::uint64_t) rsp); + nframe, realname ? realname : name, (std::uint64_t) rip, (std::uint64_t) rsp); #else - fprintf(file, " %i: %s\n", nframe, name); + fprintf(file, " %i: %s\n", nframe, realname ? realname : name); #endif + + free(realname); ++nframe; } while(unw_step(&cursor)); } -- 2.20.1