diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2024-05-06 11:48:06 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2024-05-06 11:48:06 +0000 |
commit | 838ba0ff4e4268f6c3ea4ca60a3767a089b5ff0b (patch) | |
tree | 48a9c845dbdd6774611b8dc54322302b686b7c5e /vespamalloc/src | |
parent | a16bd9a368fbc37c50442c9ea892c453d70d7228 (diff) |
Demangle symbols
Diffstat (limited to 'vespamalloc/src')
-rw-r--r-- | vespamalloc/src/vespamalloc/util/callstack.cpp | 36 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/util/callstack.h | 2 |
2 files changed, 28 insertions, 10 deletions
diff --git a/vespamalloc/src/vespamalloc/util/callstack.cpp b/vespamalloc/src/vespamalloc/util/callstack.cpp index 87938da8b7f..56b634bca33 100644 --- a/vespamalloc/src/vespamalloc/util/callstack.cpp +++ b/vespamalloc/src/vespamalloc/util/callstack.cpp @@ -2,32 +2,52 @@ #include <dlfcn.h> #include <cctype> #include <vespamalloc/util/callstack.h> +#include <string> +#include <cxxabi.h> namespace vespamalloc { -const char * -dlAddr(const void * func) { - static const char * _unknown = "UNKNOWN"; - const char * funcName = _unknown; +namespace { + +std::string +demangle(const char *native) { + int status = 0; + size_t size = 0; + char *unmangled = abi::__cxa_demangle(native, nullptr, &size, &status); + if (unmangled == nullptr) { + return ""; // Demangling failed for some reason. TODO return `native` instead? + } + std::string result(unmangled); + free(unmangled); + return result; +} + + +std::string +dlAddr(const void *func) { + static std::string _unknown = "UNKNOWN"; Dl_info info; int ret = dladdr(func, &info); if (ret != 0) { - funcName = info.dli_sname; + return demangle(info.dli_sname); } - return funcName; + return _unknown; +} + } namespace { void verifyAndCopy(const void *addr, char *v, size_t sz) { size_t pos(0); - const char *sym = dlAddr(addr); - for (; sym && (sym[pos] != '\0') && (pos < sz - 1); pos++) { + std::string sym = dlAddr(addr); + for (; (pos < sym.size()) && (pos < sz - 1); pos++) { char c(sym[pos]); v[pos] = isprint(c) ? c : '.'; } v[pos] = '\0'; } + } void diff --git a/vespamalloc/src/vespamalloc/util/callstack.h b/vespamalloc/src/vespamalloc/util/callstack.h index 3773d3c08b2..f3b177ea5f6 100644 --- a/vespamalloc/src/vespamalloc/util/callstack.h +++ b/vespamalloc/src/vespamalloc/util/callstack.h @@ -9,8 +9,6 @@ namespace vespamalloc { -const char * dlAddr(const void * addr); - class StackReturnEntry { public: StackReturnEntry(const void * returnAddress = nullptr, |