aboutsummaryrefslogtreecommitdiffstats
path: root/vespamalloc
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-05-06 11:48:06 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2024-05-06 11:48:06 +0000
commit838ba0ff4e4268f6c3ea4ca60a3767a089b5ff0b (patch)
tree48a9c845dbdd6774611b8dc54322302b686b7c5e /vespamalloc
parenta16bd9a368fbc37c50442c9ea892c453d70d7228 (diff)
Demangle symbols
Diffstat (limited to 'vespamalloc')
-rw-r--r--vespamalloc/src/vespamalloc/util/callstack.cpp36
-rw-r--r--vespamalloc/src/vespamalloc/util/callstack.h2
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,