14 Protium:Private::print_stacktrace();
20 static inline void Protium::Private::print_stacktrace(
unsigned int stack_depth)
23 std::cout<<
"Stack Trace:"<<std::endl;;
25 void* trace_addr[stack_depth+1];
27 unsigned int trace_addr_length = backtrace(trace_addr,
sizeof(trace_addr) /
sizeof(
void*));
29 if (!trace_addr_length)
31 std::cout<<
"Stack Empty"<<std::endl;
34 char** trace_symbols = backtrace_symbols(trace_addr, trace_addr_length);
36 size_t function_name_size = 256;
37 char* function_name = (
char*)malloc(function_name_size);
40 for (
int i = 1; i < trace_addr_length; i++)
42 char *begin_name = 0, *begin_offset = 0, *end_offset = 0;
43 for (
char *p = trace_symbols[i]; *p; ++p)
49 else if (*p ==
')' && begin_offset)
56 if (begin_name && begin_offset && end_offset && begin_name < begin_offset)
59 *begin_offset++ =
'\0';
67 char* ret = abi::__cxa_demangle(begin_name,
68 function_name, &function_name_size, &status);
72 std::cout<<trace_symbols[i]<<
" : "<<function_name<<
"+"<<begin_offset<<std::endl;;
76 std::cout<<trace_symbols[i]<<
" : "<<function_name<<
"()+"<<begin_offset<<std::endl;
81 std::cout<<trace_symbols[i]<<std::endl;
void signal_callback_handler(int signum)