void get_backtrace_symbols(const backtrace_frame_t* backtrace, size_t frames, backtrace_symbol_t* backtrace_symbols) { map_info_t* milist = acquire_my_map_info_list(); for (size_t i = 0; i < frames; i++) { const backtrace_frame_t* frame = &backtrace[i]; backtrace_symbol_t* symbol = &backtrace_symbols[i]; init_backtrace_symbol(symbol, frame->absolute_pc); const map_info_t* mi = find_map_info(milist, frame->absolute_pc); if (mi) { symbol->relative_pc = frame->absolute_pc - mi->start; if (mi->name[0]) { symbol->map_name = strdup(mi->name); } Dl_info info; if (dladdr((const void*)frame->absolute_pc, &info) && info.dli_sname) { symbol->relative_symbol_addr = (uintptr_t)info.dli_saddr - (uintptr_t)info.dli_fbase; symbol->symbol_name = strdup(info.dli_sname); symbol->demangled_name = demangle_symbol_name(symbol->symbol_name); } } } release_my_map_info_list(milist); }
char* local_get_proc_name(const backtrace_t* backtrace, uintptr_t pc, uintptr_t* offset) { unw_context_t* context = (unw_context_t*)backtrace->private_data; char buf[512]; *offset = 0; unw_word_t value; if (unw_get_proc_name_by_ip(unw_local_addr_space, pc, buf, sizeof(buf), &value, context) >= 0 && buf[0] != '\0') { *offset = (uintptr_t)value; char* symbol = demangle_symbol_name(buf); if (!symbol) { symbol = strdup(buf); } return symbol; } return NULL; }
void get_backtrace_symbols_ptrace(const ptrace_context_t* context, const backtrace_frame_t* backtrace, size_t frames, backtrace_symbol_t* backtrace_symbols) { for (size_t i = 0; i < frames; i++) { const backtrace_frame_t* frame = &backtrace[i]; backtrace_symbol_t* symbol = &backtrace_symbols[i]; init_backtrace_symbol(symbol, frame->absolute_pc); const map_info_t* mi; const symbol_t* s; find_symbol_ptrace(context, frame->absolute_pc, &mi, &s); if (mi) { symbol->relative_pc = frame->absolute_pc - mi->start; if (mi->name[0]) { symbol->map_name = strdup(mi->name); } } if (s) { symbol->relative_symbol_addr = s->start; symbol->symbol_name = strdup(s->name); symbol->demangled_name = demangle_symbol_name(symbol->symbol_name); } } }