53#ifdef TTG_HAS_LIBUNWIND
57 unw_word_t ip, sp, offp;
61 unw_init_local(&cursor, &uc);
62 while (unw_step(&cursor) > 0) {
63 unw_get_reg(&cursor, UNW_REG_IP, &ip);
64 unw_get_reg(&cursor, UNW_REG_SP, &sp);
66 unw_get_proc_name(&cursor, name, 32768, &offp);
67 std::ostringstream oss;
68 oss << prefix_ <<
"frame " << frame <<
": "
69 <<
"ip = 0x" << (long)ip <<
" sp = 0x" << (
long)sp <<
" symbol = " << __demangle(name);
70 frames_.push_back(oss.str());
74#elif defined(TTG_HAS_BACKTRACE)
75 void *stack_addrs[1024];
76 const int naddrs = backtrace(stack_addrs, 1024);
77 char **frame_symbols = backtrace_symbols(stack_addrs, naddrs);
79 for (
int i = 1; i < naddrs; ++i) {
83 std::string mangled_function_name = frame_symbols[i];
87 std::istringstream iss(std::string(frame_symbols[i]), std::istringstream::in);
88 std::string frame, file, address;
89 iss >> frame >> file >> address >> mangled_function_name;
91#elif defined(__linux__)
95 const auto last_right_bracket = mangled_function_name.rfind(
']');
96 const auto last_left_bracket = mangled_function_name.rfind(
'[', last_right_bracket);
97 const auto last_right_parens = mangled_function_name.rfind(
')', last_left_bracket);
98 const auto offset = mangled_function_name.rfind(
"+0x", last_right_parens);
99 const auto last_left_parens = mangled_function_name.rfind(
'(', last_right_parens);
100 if (last_left_parens + 1 < mangled_function_name.size()) {
101 mangled_function_name = mangled_function_name.substr(last_left_parens + 1, offset - last_left_parens - 1);
106 std::ostringstream oss;
107 oss << prefix_ <<
"frame " << i <<
": return address = " << stack_addrs[i] << std::endl
108 <<
" symbol = " << __demangle(mangled_function_name);
109 frames_.push_back(oss.str());
113#if defined(SIMPLE_STACK)
115 void **topstack = (
void **)0xffffffffL;
116 void **botstack = (
void **)0x70000000L;
119 void **toptext = (
void **)0xffffffffL;
120 void **bottext = (
void **)0x00010000L;
123#if (defined(linux) && defined(i386))
124 topstack = (
void **)0xc0000000;
125 botstack = (
void **)0xb0000000;
127#if (defined(__OSF1__) && defined(i860))
128 topstack = (
void **)0x80000000;
129 botstack = (
void **)0x70000000;
132#if defined(SIMPLE_STACK)
137 void **stack = (
void **)⊥
139 void **frame_pointer = (
void **)stack[3];
140 while (frame_pointer >= botstack && frame_pointer < topstack && frame_pointer[1] >= bottext &&
141 frame_pointer[1] < toptext) {
142 std::ostringstream oss;
143 oss << prefix_ <<
"frame: " << (
void *)frame_pointer;
144 oss <<
" retaddr: " << frame_pointer[1];
145 frames_.push_back(oss.str());
147 frame_pointer = (
void **)*frame_pointer;
166 char *dsymbol_char = abi::__cxa_demangle(symbol.c_str(), 0, 0, &status);