4 #if defined(_WIN32) && defined(_MSC_VER)
10 #if !defined(_WIN32) && !defined(__HAIKU__)
25 const string RTTI::demangle(
const string& name) {
26 #if defined(_WIN32) && defined(_MSC_VER)
27 auto demangledNameString = name;
28 return demangledNameString;
31 char* demangledName = abi::__cxa_demangle(name.c_str(), 0, 0, &status);
32 string demangledNameString(demangledName ==
nullptr?name:demangledName);
34 return demangledNameString;
39 #if defined(_WIN32) || defined(__HAIKU__)
40 return "No backtrace available";
45 auto strings = ::backtrace_symbols(buffer, size);
46 if (strings ==
nullptr)
return "No backtrace available";
49 for (
int i = 1; i < size && strings !=
nullptr; ++i) {
50 char* mangledName = 0, *offsetBegin = 0, *offsetEnd = 0;
52 for (
char* p = strings[i]; *p; ++p) {
55 }
else if (*p ==
'+') {
57 }
else if (*p ==
')') {
63 if (mangledName && offsetBegin && offsetEnd && mangledName < offsetBegin) {
64 *mangledName++ =
'\0';
65 *offsetBegin++ =
'\0';
68 char* realName = abi::__cxa_demangle(mangledName, 0, 0, &status);
71 result+= to_string(i) +
": " + strings[i] +
": " + realName +
"\n";
74 result+= to_string(i) +
": " + strings[i] +
": " + mangledName +
"\n";
79 result+= to_string(i) +
": " + strings[i] +
"\n";
Run time type information utility class.
static const string backtrace()
Returns the current backtrace as string.