40 const char* fmt, ...) {
47 p += vsnprintf(buffer + p,
sizeof(buffer) - p - 1, fmt, args);
49#if TLX_HAVE_BACKTRACE_FUNC
52 void** addrlist =
reinterpret_cast<void**
>(
53 alloca(
sizeof(
void*) * max_frames));
56 int addrlen = backtrace(addrlist, max_frames);
58 for (
int i = 1; i < addrlen; ++i) {
59 if (addrlist[i] ==
nullptr)
62 p += snprintf(buffer + p,
sizeof(buffer) - p - 1,
" %p", addrlist[i]);
66 fprintf(out,
"%s\n", buffer);
70 fprintf(out,
"(backtrace not supported on this platform)\n");
83 fprintf(out,
"backtrace:\n");
85#if TLX_HAVE_BACKTRACE_FUNC
88 void** addrlist =
reinterpret_cast<void**
>(
89 alloca(
sizeof(
void*) * max_frames));
92 int addrlen = backtrace(addrlist, max_frames);
95 fprintf(out,
" <empty, possibly corrupt>\n");
101 char** symbollist = backtrace_symbols(addrlist, addrlen);
104 size_t funcnamesize = 256;
105 char* funcname =
reinterpret_cast<char*
>(alloca(funcnamesize));
109 for (
int i = 1; i < addrlen; i++)
111 char* begin_name = 0, * begin_offset = 0, * end_offset = 0;
115 for (
char* p = symbollist[i]; *p; ++p)
121 else if (*p ==
')' && begin_offset) {
127 if (begin_name && begin_offset && end_offset
128 && begin_name < begin_offset)
130 *begin_name++ =
'\0';
131 *begin_offset++ =
'\0';
139 char* ret = abi::__cxa_demangle(begin_name,
140 funcname, &funcnamesize, &status);
143 fprintf(out,
" %s : %s+%s\n",
144 symbollist[i], funcname, begin_offset);
149 fprintf(out,
" %s : %s()+%s\n",
150 symbollist[i], begin_name, begin_offset);
156 fprintf(out,
" %s\n", symbollist[i]);
164 fprintf(out,
" (not supported on this platform)\n");
void print_raw_backtrace(FILE *out, unsigned int max_frames, const char *fmt,...)
Print a plain hex stack backtrace of the called function to FILE* out, prefixed with the given printf...