diff options
| author | 2013-11-05 07:04:12 -0800 | |
|---|---|---|
| committer | 2013-11-05 07:04:12 -0800 | |
| commit | 6b98c91275d4361d1b74effad36995cc2d687a55 (patch) | |
| tree | b96cc0d6d15cc60adf0939252b93bb47cb210448 /runtime/utils.cc | |
| parent | 610e49f5adc8b5e4a37696aa20fc029dab6b1e40 (diff) | |
| parent | 7b5f0cf08f74ff36760a813888779d28a175982d (diff) | |
am 7b5f0cf0: Use libbacktrace instead of libcorkscrew.
* commit '7b5f0cf08f74ff36760a813888779d28a175982d':
Use libbacktrace instead of libcorkscrew.
Diffstat (limited to 'runtime/utils.cc')
| -rw-r--r-- | runtime/utils.cc | 95 |
1 files changed, 20 insertions, 75 deletions
diff --git a/runtime/utils.cc b/runtime/utils.cc index f9e4ebe14d..9796b99635 100644 --- a/runtime/utils.cc +++ b/runtime/utils.cc @@ -49,8 +49,7 @@ #include <sys/syscall.h> #endif -#include <corkscrew/backtrace.h> // For DumpNativeStack. -#include <corkscrew/demangle.h> // For DumpNativeStack. +#include <backtrace/Backtrace.h> // For DumpNativeStack. #if defined(__linux__) #include <linux/unistd.h> @@ -1001,10 +1000,9 @@ std::string GetSchedulerGroupName(pid_t tid) { return ""; } -static const char* CleanMapName(const backtrace_symbol_t* symbol) { - const char* map_name = symbol->map_name; +static const char* CleanMapName(const char* map_name) { if (map_name == NULL) { - map_name = "???"; + return "???"; } // Turn "/usr/local/google/home/enh/clean-dalvik-dev/out/host/linux-x86/lib/libartd.so" // into "libartd.so". @@ -1015,89 +1013,36 @@ static const char* CleanMapName(const backtrace_symbol_t* symbol) { return map_name; } -static void FindSymbolInElf(const backtrace_frame_t* frame, const backtrace_symbol_t* symbol, - std::string& symbol_name, uint32_t& pc_offset) { - symbol_table_t* symbol_table = NULL; - if (symbol->map_name != NULL) { - symbol_table = load_symbol_table(symbol->map_name); - } - const symbol_t* elf_symbol = NULL; - bool was_relative = true; - if (symbol_table != NULL) { - elf_symbol = find_symbol(symbol_table, symbol->relative_pc); - if (elf_symbol == NULL) { - elf_symbol = find_symbol(symbol_table, frame->absolute_pc); - was_relative = false; - } - } - if (elf_symbol != NULL) { - const char* demangled_symbol_name = demangle_symbol_name(elf_symbol->name); - if (demangled_symbol_name != NULL) { - symbol_name = demangled_symbol_name; - } else { - symbol_name = elf_symbol->name; - } - - // TODO: is it a libcorkscrew bug that we have to do this? - pc_offset = (was_relative ? symbol->relative_pc : frame->absolute_pc) - elf_symbol->start; - } else { - symbol_name = "???"; - } - free_symbol_table(symbol_table); -} - void DumpNativeStack(std::ostream& os, pid_t tid, const char* prefix, bool include_count) { - // Ensure libcorkscrew doesn't use a stale cache of /proc/self/maps. - flush_my_map_info_list(); - - const size_t MAX_DEPTH = 32; - UniquePtr<backtrace_frame_t[]> frames(new backtrace_frame_t[MAX_DEPTH]); - size_t ignore_count = 2; // Don't include unwind_backtrace_thread or DumpNativeStack. - ssize_t frame_count = unwind_backtrace_thread(tid, frames.get(), ignore_count, MAX_DEPTH); - if (frame_count == -1) { - os << prefix << "(unwind_backtrace_thread failed for thread " << tid << ")\n"; + UniquePtr<Backtrace> backtrace(Backtrace::Create(-1, tid)); + if (!backtrace->Unwind(0)) { + os << prefix << "(backtrace::Unwind failed for thread " << tid << ")\n"; return; - } else if (frame_count == 0) { + } else if (backtrace->NumFrames() == 0) { os << prefix << "(no native stack frames for thread " << tid << ")\n"; return; } - UniquePtr<backtrace_symbol_t[]> backtrace_symbols(new backtrace_symbol_t[frame_count]); - get_backtrace_symbols(frames.get(), frame_count, backtrace_symbols.get()); - - for (size_t i = 0; i < static_cast<size_t>(frame_count); ++i) { - const backtrace_frame_t* frame = &frames[i]; - const backtrace_symbol_t* symbol = &backtrace_symbols[i]; - + for (size_t i = 0; i < backtrace->NumFrames(); ++i) { // We produce output like this: - // ] #00 unwind_backtrace_thread+536 [0x55d75bb8] (libcorkscrew.so) - - std::string symbol_name; - uint32_t pc_offset = 0; - if (symbol->demangled_name != NULL) { - symbol_name = symbol->demangled_name; - pc_offset = symbol->relative_pc - symbol->relative_symbol_addr; - } else if (symbol->symbol_name != NULL) { - symbol_name = symbol->symbol_name; - pc_offset = symbol->relative_pc - symbol->relative_symbol_addr; - } else { - // dladdr(3) didn't find a symbol; maybe it's static? Look in the ELF file... - FindSymbolInElf(frame, symbol, symbol_name, pc_offset); - } + // ] #00 unwind_backtrace_thread+536 [0x55d75bb8] (libbacktrace.so) + const backtrace_frame_data_t* frame = backtrace->GetFrame(i); os << prefix; if (include_count) { - os << StringPrintf("#%02zd ", i); + os << StringPrintf("#%02zu ", i); + } + if (frame->func_name) { + os << frame->func_name; + } else { + os << "???"; } - os << symbol_name; - if (pc_offset != 0) { - os << "+" << pc_offset; + if (frame->func_offset != 0) { + os << "+" << frame->func_offset; } - os << StringPrintf(" [%p] (%s)\n", - reinterpret_cast<void*>(frame->absolute_pc), CleanMapName(symbol)); + os << StringPrintf(" [%p]", reinterpret_cast<void*>(frame->pc)); + os << " (" << CleanMapName(frame->map_name) << ")\n"; } - - free_backtrace_symbols(backtrace_symbols.get(), frame_count); } #if defined(__APPLE__) |