15 #ifdef MRPT_OS_WINDOWS 16 #define WIN32_LEAN_AND_MEAN 32 const unsigned int framesToSkip =
34 const unsigned int framesToCapture = 64;
36 #ifdef MRPT_OS_WINDOWS 37 void* backTrace[framesToCapture]{};
39 SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS);
40 const HANDLE hProcess = GetCurrentProcess();
42 hProcess,
nullptr ,
TRUE ))
45 <<
"[mrpt::system::getCallStackBackTrace] Error in SymInitialize()!" 50 char buffer[
sizeof(SYMBOL_INFO) + MAX_SYM_NAME *
sizeof(TCHAR)];
51 PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)
buffer;
52 pSymbol->SizeOfStruct =
sizeof(SYMBOL_INFO);
53 pSymbol->MaxNameLen = MAX_SYM_NAME;
55 const USHORT nFrames = CaptureStackBackTrace(
56 framesToSkip, framesToCapture, backTrace,
nullptr);
57 for (
unsigned int i = 0; i < nFrames; i++)
62 if (!SymFromAddr(hProcess, (DWORD64)cse.
address,
nullptr, pSymbol))
69 SYMBOL_INFO& si = *pSymbol;
72 char undecorated_name[1024];
73 if (!UnDecorateSymbolName(
74 si.Name, undecorated_name,
sizeof(undecorated_name),
88 void* callstack[framesToCapture];
89 const int nMaxFrames =
sizeof(callstack) /
sizeof(callstack[0]);
90 int nFrames = ::backtrace(callstack, nMaxFrames);
91 char** symbols = ::backtrace_symbols(callstack, nFrames);
93 for (
int i = (
int)framesToSkip; i < nFrames; i++)
99 if (dladdr(callstack[i], &info) && info.dli_sname)
101 char* demangled = NULL;
103 if (info.dli_sname[0] ==
'_')
106 abi::__cxa_demangle(info.dli_sname, NULL, 0, &
status);
109 info.dli_sname == 0 ? symbols[i] : info.dli_sname;
123 std::ostringstream trace_buf;
124 trace_buf <<
"Callstack backtrace:" << std::endl;
125 for (
unsigned int i = 0; i < this->backtrace_levels.size(); i++)
128 "[%-2d] %*p %s", i,
int(2 +
sizeof(
void*) * 2),
130 backtrace_levels[i].symbolName.c_str())
133 return trace_buf.str();
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
Used in getCallStackBackTrace()
void getCallStackBackTrace(TCallStackBackTrace &out_bt)
Returns a list of strings representing the current call stack backtrace.
void * address
Address of the calling point.
std::string symbolName
Demangled symbol name.
std::vector< TCallStackEntry > backtrace_levels
GLsizei const GLchar ** string
std::string symbolNameOriginal
Original (before demangle) symbol name.
See: getCallStackBackTrace()
std::string asString() const
Prints all backtrace entries, one per line in a human-readable format.