From 5d991bc351faf86ae08a6db248509e1650253156 Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Tue, 15 Nov 2016 17:47:09 -0800 Subject: [PATCH] libbacktrace_offline: support .ARM.exidx. 1. Read .ARM.exidx and .ARM.extab, provides these data to libunwind through AccessMem. 2. In FindProcInfo, search .ARM.exidx for the idx entry of function containing ip. 3. Add structures to store .ARM.exidx info in DebugFrameInfo, and clean up the structure. 4. Add tests to test each unwind information (.eh_frame, .debug_frame, .gnu_debugdata, .ARM.exidx) separately. Bug: http://b/30974693 Test: run backtrace_test. Test: run simpleperf runtest.py. Change-Id: I9377a54379158bd35860efcf0e011423be7350d4 --- libbacktrace/Android.bp | 15 +- libbacktrace/Android.mk | 2 - libbacktrace/BacktraceOffline.cpp | 325 ++++++++++++------ libbacktrace/BacktraceOffline.h | 32 +- libbacktrace/backtrace_offline_test.cpp | 322 ++++++++++++----- libbacktrace/backtrace_testlib.c | 21 ++ .../aarch64/libbacktrace_test_eh_frame.so | Bin 0 -> 12232 bytes .../testdata/aarch64/offline_testdata | 107 ++++++ .../arm/libbacktrace_test_arm_exidx.so | Bin 0 -> 13804 bytes .../arm/libbacktrace_test_debug_frame.so | Bin 0 -> 99808 bytes .../arm/libbacktrace_test_gnu_debugdata.so | Bin 0 -> 36456 bytes libbacktrace/testdata/arm/offline_testdata | 105 ++++++ .../x86/libbacktrace_test_debug_frame.so | Bin 0 -> 12907 bytes .../x86/libbacktrace_test_gnu_debugdata.so | Bin 0 -> 8572 bytes libbacktrace/testdata/x86/offline_testdata | 82 +++++ .../x86_64/libbacktrace_test_eh_frame.so | Bin 0 -> 16752 bytes libbacktrace/testdata/x86_64/offline_testdata | 93 +++++ 17 files changed, 877 insertions(+), 227 deletions(-) create mode 100755 libbacktrace/testdata/aarch64/libbacktrace_test_eh_frame.so create mode 100644 libbacktrace/testdata/aarch64/offline_testdata create mode 100755 libbacktrace/testdata/arm/libbacktrace_test_arm_exidx.so create mode 100755 libbacktrace/testdata/arm/libbacktrace_test_debug_frame.so create mode 100755 libbacktrace/testdata/arm/libbacktrace_test_gnu_debugdata.so create mode 100644 libbacktrace/testdata/arm/offline_testdata create mode 100755 libbacktrace/testdata/x86/libbacktrace_test_debug_frame.so create mode 100755 libbacktrace/testdata/x86/libbacktrace_test_gnu_debugdata.so create mode 100644 libbacktrace/testdata/x86/offline_testdata create mode 100755 libbacktrace/testdata/x86_64/libbacktrace_test_eh_frame.so create mode 100644 libbacktrace/testdata/x86_64/offline_testdata diff --git a/libbacktrace/Android.bp b/libbacktrace/Android.bp index 5c7223418..200b6d637 100644 --- a/libbacktrace/Android.bp +++ b/libbacktrace/Android.bp @@ -117,4 +117,17 @@ cc_library_shared { }, cflags: ["-O0"], srcs: ["backtrace_testlib.c"], -} + + target: { + linux: { + shared_libs: [ + "libunwind", + ], + }, + android: { + shared_libs: [ + "libunwind", + ], + }, + } +} \ No newline at end of file diff --git a/libbacktrace/Android.mk b/libbacktrace/Android.mk index 0f0187293..f4976e954 100644 --- a/libbacktrace/Android.mk +++ b/libbacktrace/Android.mk @@ -111,8 +111,6 @@ backtrace_test_static_libraries_host := \ backtrace_test_ldlibs_host += \ -ldl \ -backtrace_test_strip_module := false - module := backtrace_test module_tag := debug build_type := target diff --git a/libbacktrace/BacktraceOffline.cpp b/libbacktrace/BacktraceOffline.cpp index a05a6d894..9e95563b0 100644 --- a/libbacktrace/BacktraceOffline.cpp +++ b/libbacktrace/BacktraceOffline.cpp @@ -50,6 +50,48 @@ extern "C" { #include "BacktraceLog.h" +struct EhFrame { + uint64_t hdr_vaddr; + uint64_t vaddr; + uint64_t fde_table_offset; + uintptr_t min_func_vaddr; + std::vector hdr_data; + std::vector data; +}; + +struct ArmIdxEntry { + uint32_t func_offset; + uint32_t value; +}; + +struct ArmExidx { + uint64_t exidx_vaddr; + uint64_t extab_vaddr; + std::vector exidx_data; + std::vector extab_data; + // There is a one-to-one map from exidx_data.func_offset to func_vaddr_array. + std::vector func_vaddr_array; +}; + +struct DebugFrameInfo { + bool has_arm_exidx; + bool has_eh_frame; + bool has_debug_frame; + bool has_gnu_debugdata; + + EhFrame eh_frame; + ArmExidx arm_exidx; + + uint64_t min_vaddr; + uint64_t text_end_vaddr; + + DebugFrameInfo() : has_arm_exidx(false), has_eh_frame(false), + has_debug_frame(false), has_gnu_debugdata(false) { } +}; + +static std::unordered_map>& g_debug_frames = + *new std::unordered_map>; + void Space::Clear() { start = 0; end = 0; @@ -207,23 +249,18 @@ size_t BacktraceOffline::Read(uintptr_t addr, uint8_t* buffer, size_t bytes) { if (read_size != 0) { return read_size; } + read_size = arm_exidx_space_.Read(addr, buffer, bytes); + if (read_size != 0) { + return read_size; + } + read_size = arm_extab_space_.Read(addr, buffer, bytes); + if (read_size != 0) { + return read_size; + } read_size = stack_space_.Read(addr, buffer, bytes); return read_size; } -static bool FileOffsetToVaddr( - const std::vector& program_headers, - uint64_t file_offset, uint64_t* vaddr) { - for (auto& header : program_headers) { - if (file_offset >= header.file_offset && file_offset < header.file_offset + header.file_size) { - // TODO: Consider load_bias? - *vaddr = file_offset - header.file_offset + header.vaddr; - return true; - } - } - return false; -} - bool BacktraceOffline::FindProcInfo(unw_addr_space_t addr_space, uint64_t ip, unw_proc_info_t* proc_info, int need_unwind_info) { backtrace_map_t map; @@ -236,45 +273,90 @@ bool BacktraceOffline::FindProcInfo(unw_addr_space_t addr_space, uint64_t ip, if (debug_frame == nullptr) { return false; } - if (debug_frame->is_eh_frame) { - uint64_t ip_offset = ip - map.start + map.offset; - uint64_t ip_vaddr; // vaddr in the elf file. - bool result = FileOffsetToVaddr(debug_frame->eh_frame.program_headers, ip_offset, &ip_vaddr); - if (!result) { - return false; - } - // Calculate the addresses where .eh_frame_hdr and .eh_frame stay when the process was running. - eh_frame_hdr_space_.start = (ip - ip_vaddr) + debug_frame->eh_frame.eh_frame_hdr_vaddr; - eh_frame_hdr_space_.end = - eh_frame_hdr_space_.start + debug_frame->eh_frame.eh_frame_hdr_data.size(); - eh_frame_hdr_space_.data = debug_frame->eh_frame.eh_frame_hdr_data.data(); - - eh_frame_space_.start = (ip - ip_vaddr) + debug_frame->eh_frame.eh_frame_vaddr; - eh_frame_space_.end = eh_frame_space_.start + debug_frame->eh_frame.eh_frame_data.size(); - eh_frame_space_.data = debug_frame->eh_frame.eh_frame_data.data(); - - unw_dyn_info di; - memset(&di, '\0', sizeof(di)); - di.start_ip = map.start; - di.end_ip = map.end; - di.format = UNW_INFO_FORMAT_REMOTE_TABLE; - di.u.rti.name_ptr = 0; - di.u.rti.segbase = eh_frame_hdr_space_.start; - di.u.rti.table_data = - eh_frame_hdr_space_.start + debug_frame->eh_frame.fde_table_offset_in_eh_frame_hdr; - di.u.rti.table_len = (eh_frame_hdr_space_.end - di.u.rti.table_data) / sizeof(unw_word_t); - int ret = dwarf_search_unwind_table(addr_space, ip, &di, proc_info, need_unwind_info, this); - return ret == 0; - } eh_frame_hdr_space_.Clear(); eh_frame_space_.Clear(); - unw_dyn_info_t di; - unw_word_t segbase = map.start - map.offset; - int found = dwarf_find_debug_frame(0, &di, ip, segbase, filename.c_str(), map.start, map.end); - if (found == 1) { - int ret = dwarf_search_unwind_table(addr_space, ip, &di, proc_info, need_unwind_info, this); - return ret == 0; + arm_exidx_space_.Clear(); + arm_extab_space_.Clear(); + + // vaddr in the elf file. + uint64_t ip_vaddr = ip - map.start + debug_frame->min_vaddr; + if (debug_frame->has_arm_exidx) { + auto& func_vaddrs = debug_frame->arm_exidx.func_vaddr_array; + if (ip_vaddr >= func_vaddrs[0] && ip_vaddr < debug_frame->text_end_vaddr) { + // Use binary search to find the correct function. + auto it = std::upper_bound(func_vaddrs.begin(), func_vaddrs.end(), + static_cast(ip_vaddr)); + if (it != func_vaddrs.begin()) { + --it; + // Found the exidx entry. + size_t index = it - func_vaddrs.begin(); + + proc_info->format = UNW_INFO_FORMAT_ARM_EXIDX; + proc_info->unwind_info = reinterpret_cast( + static_cast(index * sizeof(ArmIdxEntry) + + debug_frame->arm_exidx.exidx_vaddr + + debug_frame->min_vaddr)); + + // Prepare arm_exidx space and arm_extab space. + arm_exidx_space_.start = debug_frame->min_vaddr + debug_frame->arm_exidx.exidx_vaddr; + arm_exidx_space_.end = arm_exidx_space_.start + + debug_frame->arm_exidx.exidx_data.size() * sizeof(ArmIdxEntry); + arm_exidx_space_.data = reinterpret_cast( + debug_frame->arm_exidx.exidx_data.data()); + + arm_extab_space_.start = debug_frame->min_vaddr + debug_frame->arm_exidx.extab_vaddr; + arm_extab_space_.end = arm_extab_space_.start + + debug_frame->arm_exidx.extab_data.size(); + arm_extab_space_.data = debug_frame->arm_exidx.extab_data.data(); + return true; + } + } + } + + if (debug_frame->has_eh_frame) { + if (ip_vaddr >= debug_frame->eh_frame.min_func_vaddr && + ip_vaddr < debug_frame->text_end_vaddr) { + // Prepare eh_frame_hdr space and eh_frame space. + eh_frame_hdr_space_.start = ip - ip_vaddr + debug_frame->eh_frame.hdr_vaddr; + eh_frame_hdr_space_.end = + eh_frame_hdr_space_.start + debug_frame->eh_frame.hdr_data.size(); + eh_frame_hdr_space_.data = debug_frame->eh_frame.hdr_data.data(); + + eh_frame_space_.start = ip - ip_vaddr + debug_frame->eh_frame.vaddr; + eh_frame_space_.end = eh_frame_space_.start + debug_frame->eh_frame.data.size(); + eh_frame_space_.data = debug_frame->eh_frame.data.data(); + + unw_dyn_info di; + memset(&di, '\0', sizeof(di)); + di.start_ip = map.start; + di.end_ip = map.end; + di.format = UNW_INFO_FORMAT_REMOTE_TABLE; + di.u.rti.name_ptr = 0; + di.u.rti.segbase = eh_frame_hdr_space_.start; + di.u.rti.table_data = + eh_frame_hdr_space_.start + debug_frame->eh_frame.fde_table_offset; + di.u.rti.table_len = (eh_frame_hdr_space_.end - di.u.rti.table_data) / sizeof(unw_word_t); + // TODO: Do it ourselves is more efficient than calling this function. + int ret = dwarf_search_unwind_table(addr_space, ip, &di, proc_info, need_unwind_info, this); + if (ret == 0) { + return true; + } + } + } + + if (debug_frame->has_debug_frame || debug_frame->has_gnu_debugdata) { + unw_dyn_info_t di; + unw_word_t segbase = map.start - map.offset; + // TODO: http://b/32916571 + // TODO: Do it ourselves is more efficient than calling libunwind functions. + int found = dwarf_find_debug_frame(0, &di, ip, segbase, filename.c_str(), map.start, map.end); + if (found == 1) { + int ret = dwarf_search_unwind_table(addr_space, ip, &di, proc_info, need_unwind_info, this); + if (ret == 0) { + return true; + } + } } return false; } @@ -462,33 +544,18 @@ std::string BacktraceOffline::GetFunctionNameRaw(uintptr_t, uintptr_t* offset) { return ""; } -std::unordered_map> BacktraceOffline::debug_frames_; -std::unordered_set BacktraceOffline::debug_frame_missing_files_; - static DebugFrameInfo* ReadDebugFrameFromFile(const std::string& filename); DebugFrameInfo* BacktraceOffline::GetDebugFrameInFile(const std::string& filename) { if (cache_file_) { - auto it = debug_frames_.find(filename); - if (it != debug_frames_.end()) { + auto it = g_debug_frames.find(filename); + if (it != g_debug_frames.end()) { return it->second.get(); } - if (debug_frame_missing_files_.find(filename) != debug_frame_missing_files_.end()) { - return nullptr; - } } DebugFrameInfo* debug_frame = ReadDebugFrameFromFile(filename); if (cache_file_) { - if (debug_frame != nullptr) { - debug_frames_.emplace(filename, std::unique_ptr(debug_frame)); - } else { - debug_frame_missing_files_.insert(filename); - } - } else { - if (last_debug_frame_ != nullptr) { - delete last_debug_frame_; - } - last_debug_frame_ = debug_frame; + g_debug_frames.emplace(filename, std::unique_ptr(debug_frame)); } return debug_frame; } @@ -556,72 +623,106 @@ static bool GetFdeTableOffsetInEhFrameHdr(const std::vector& data, return true; } -using ProgramHeader = DebugFrameInfo::EhFrame::ProgramHeader; - template DebugFrameInfo* ReadDebugFrameFromELFFile(const llvm::object::ELFFile* elf) { + DebugFrameInfo* result = new DebugFrameInfo; + result->text_end_vaddr = std::numeric_limits::max(); + bool has_eh_frame_hdr = false; - uint64_t eh_frame_hdr_vaddr = 0; - std::vector eh_frame_hdr_data; bool has_eh_frame = false; - uint64_t eh_frame_vaddr = 0; - std::vector eh_frame_data; for (auto it = elf->section_begin(); it != elf->section_end(); ++it) { llvm::ErrorOr name = elf->getSectionName(&*it); if (name) { - if (name.get() == ".debug_frame") { - DebugFrameInfo* debug_frame = new DebugFrameInfo; - debug_frame->is_eh_frame = false; - return debug_frame; - } - if (name.get() == ".eh_frame_hdr") { - has_eh_frame_hdr = true; - eh_frame_hdr_vaddr = it->sh_addr; + std::string s = name.get(); + if (s == ".debug_frame") { + result->has_debug_frame = true; + } else if (s == ".gnu_debugdata") { + result->has_gnu_debugdata = true; + } else if (s == ".eh_frame_hdr") { + result->eh_frame.hdr_vaddr = it->sh_addr; llvm::ErrorOr> data = elf->getSectionContents(&*it); if (data) { - eh_frame_hdr_data.insert(eh_frame_hdr_data.begin(), data->data(), - data->data() + data->size()); - } else { - return nullptr; + result->eh_frame.hdr_data.insert(result->eh_frame.hdr_data.end(), + data->data(), data->data() + data->size()); + + uint64_t fde_table_offset; + if (GetFdeTableOffsetInEhFrameHdr(result->eh_frame.hdr_data, + &fde_table_offset)) { + result->eh_frame.fde_table_offset = fde_table_offset; + // Make sure we have at least one entry in fde_table. + if (fde_table_offset + 2 * sizeof(int32_t) <= data->size()) { + intptr_t eh_frame_hdr_vaddr = it->sh_addr; + int32_t sdata; + uint8_t* p = result->eh_frame.hdr_data.data() + fde_table_offset; + memcpy(&sdata, p, sizeof(sdata)); + result->eh_frame.min_func_vaddr = eh_frame_hdr_vaddr + sdata; + has_eh_frame_hdr = true; + } + } } - } else if (name.get() == ".eh_frame") { - has_eh_frame = true; - eh_frame_vaddr = it->sh_addr; + } else if (s == ".eh_frame") { + result->eh_frame.vaddr = it->sh_addr; llvm::ErrorOr> data = elf->getSectionContents(&*it); if (data) { - eh_frame_data.insert(eh_frame_data.begin(), data->data(), data->data() + data->size()); - } else { - return nullptr; + result->eh_frame.data.insert(result->eh_frame.data.end(), + data->data(), data->data() + data->size()); + has_eh_frame = true; } + } else if (s == ".ARM.exidx") { + result->arm_exidx.exidx_vaddr = it->sh_addr; + llvm::ErrorOr> data = elf->getSectionContents(&*it); + if (data) { + size_t entry_count = data->size() / sizeof(ArmIdxEntry); + result->arm_exidx.exidx_data.resize(entry_count); + memcpy(result->arm_exidx.exidx_data.data(), data->data(), + entry_count * sizeof(ArmIdxEntry)); + if (entry_count > 0u) { + // Change IdxEntry.func_offset into vaddr. + result->arm_exidx.func_vaddr_array.reserve(entry_count); + uint32_t vaddr = it->sh_addr; + for (auto& entry : result->arm_exidx.exidx_data) { + uint32_t func_offset = entry.func_offset + vaddr; + // Clear bit 31 for the prel31 offset. + // Arm sets bit 0 to mark it as thumb code, remove the flag. + result->arm_exidx.func_vaddr_array.push_back( + func_offset & 0x7ffffffe); + vaddr += 8; + } + result->has_arm_exidx = true; + } + } + } else if (s == ".ARM.extab") { + result->arm_exidx.extab_vaddr = it->sh_addr; + llvm::ErrorOr> data = elf->getSectionContents(&*it); + if (data) { + result->arm_exidx.extab_data.insert(result->arm_exidx.extab_data.end(), + data->data(), data->data() + data->size()); + } + } else if (s == ".text") { + result->text_end_vaddr = it->sh_addr + it->sh_size; } } } - if (!(has_eh_frame_hdr && has_eh_frame)) { - return nullptr; - } - uint64_t fde_table_offset; - if (!GetFdeTableOffsetInEhFrameHdr(eh_frame_hdr_data, &fde_table_offset)) { - return nullptr; + + if (has_eh_frame_hdr && has_eh_frame) { + result->has_eh_frame = true; } - std::vector program_headers; + result->min_vaddr = std::numeric_limits::max(); for (auto it = elf->program_header_begin(); it != elf->program_header_end(); ++it) { - ProgramHeader header; - header.vaddr = it->p_vaddr; - header.file_offset = it->p_offset; - header.file_size = it->p_filesz; - program_headers.push_back(header); + if ((it->p_type == llvm::ELF::PT_LOAD) && (it->p_flags & llvm::ELF::PF_X)) { + if (it->p_vaddr < result->min_vaddr) { + result->min_vaddr = it->p_vaddr; + } + } } - DebugFrameInfo* debug_frame = new DebugFrameInfo; - debug_frame->is_eh_frame = true; - debug_frame->eh_frame.eh_frame_hdr_vaddr = eh_frame_hdr_vaddr; - debug_frame->eh_frame.eh_frame_vaddr = eh_frame_vaddr; - debug_frame->eh_frame.fde_table_offset_in_eh_frame_hdr = fde_table_offset; - debug_frame->eh_frame.eh_frame_hdr_data = std::move(eh_frame_hdr_data); - debug_frame->eh_frame.eh_frame_data = std::move(eh_frame_data); - debug_frame->eh_frame.program_headers = program_headers; - return debug_frame; + if (!result->has_eh_frame && !result->has_arm_exidx && !result->has_debug_frame && + !result->has_gnu_debugdata) { + delete result; + return nullptr; + } + return result; } static bool IsValidElfPath(const std::string& filename) { diff --git a/libbacktrace/BacktraceOffline.h b/libbacktrace/BacktraceOffline.h index 42f826da9..c0b686e3f 100644 --- a/libbacktrace/BacktraceOffline.h +++ b/libbacktrace/BacktraceOffline.h @@ -40,22 +40,7 @@ struct Space { size_t Read(uint64_t addr, uint8_t* buffer, size_t size); }; -struct DebugFrameInfo { - bool is_eh_frame; - struct EhFrame { - uint64_t eh_frame_hdr_vaddr; - uint64_t eh_frame_vaddr; - uint64_t fde_table_offset_in_eh_frame_hdr; - std::vector eh_frame_hdr_data; - std::vector eh_frame_data; - struct ProgramHeader { - uint64_t vaddr; - uint64_t file_offset; - uint64_t file_size; - }; - std::vector program_headers; - } eh_frame; -}; +struct DebugFrameInfo; class BacktraceOffline : public Backtrace { public: @@ -63,18 +48,13 @@ class BacktraceOffline : public Backtrace { bool cache_file) : Backtrace(pid, tid, map), cache_file_(cache_file), - context_(nullptr), - last_debug_frame_(nullptr) { + context_(nullptr) { stack_space_.start = stack.start; stack_space_.end = stack.end; stack_space_.data = stack.data; } - virtual ~BacktraceOffline() { - if (last_debug_frame_ != nullptr) { - delete last_debug_frame_; - } - } + virtual ~BacktraceOffline() = default; bool Unwind(size_t num_ignore_frames, ucontext_t* context) override; @@ -91,15 +71,13 @@ class BacktraceOffline : public Backtrace { std::string GetFunctionNameRaw(uintptr_t pc, uintptr_t* offset) override; DebugFrameInfo* GetDebugFrameInFile(const std::string& filename); - static std::unordered_map> debug_frames_; - static std::unordered_set debug_frame_missing_files_; - bool cache_file_; ucontext_t* context_; Space eh_frame_hdr_space_; Space eh_frame_space_; + Space arm_extab_space_; + Space arm_exidx_space_; Space stack_space_; - DebugFrameInfo* last_debug_frame_; }; #endif // _LIBBACKTRACE_BACKTRACE_OFFLINE_H diff --git a/libbacktrace/backtrace_offline_test.cpp b/libbacktrace/backtrace_offline_test.cpp index d6dc2c960..49fcb29c4 100644 --- a/libbacktrace/backtrace_offline_test.cpp +++ b/libbacktrace/backtrace_offline_test.cpp @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include #include #include #include @@ -9,6 +26,9 @@ #include #include +#include +#include +#include #include #include #include @@ -22,29 +42,7 @@ int test_level_two(int, int, int, int, void (*)(void*), void*); int test_level_three(int, int, int, int, void (*)(void*), void*); int test_level_four(int, int, int, int, void (*)(void*), void*); int test_recursive_call(int, void (*)(void*), void*); -} - -static volatile bool g_exit_flag = false; - -static void GetContextAndExit(void* arg) { - unw_context_t* unw_context = reinterpret_cast(arg); - unw_getcontext(unw_context); - // Don't touch the stack anymore. - while (!g_exit_flag) { - } -} - -struct OfflineThreadArg { - unw_context_t unw_context; - pid_t tid; - std::function function; -}; - -static void* OfflineThreadFunc(void* arg) { - OfflineThreadArg* fn_arg = reinterpret_cast(arg); - fn_arg->tid = gettid(); - fn_arg->function(GetContextAndExit, &fn_arg->unw_context); - return nullptr; +void test_get_context_and_wait(unw_context_t* unw_context, volatile int* exit_flag); } static ucontext_t GetUContextFromUnwContext(const unw_context_t& unw_context) { @@ -73,11 +71,68 @@ static ucontext_t GetUContextFromUnwContext(const unw_context_t& unw_context) { return ucontext; } -static void OfflineBacktraceFunctionCall(const std::function& function, - std::vector* pc_values) { +struct FunctionSymbol { + std::string name; + uintptr_t start; + uintptr_t end; +}; + +static std::vector GetFunctionSymbols() { + std::vector symbols = { + {"unknown_start", 0, 0}, + {"test_level_one", reinterpret_cast(&test_level_one), 0}, + {"test_level_two", reinterpret_cast(&test_level_two), 0}, + {"test_level_three", reinterpret_cast(&test_level_three), 0}, + {"test_level_four", reinterpret_cast(&test_level_four), 0}, + {"test_recursive_call", reinterpret_cast(&test_recursive_call), 0}, + {"test_get_context_and_wait", reinterpret_cast(&test_get_context_and_wait), 0}, + {"unknown_end", static_cast(-1), static_cast(-1)}, + }; + std::sort( + symbols.begin(), symbols.end(), + [](const FunctionSymbol& s1, const FunctionSymbol& s2) { return s1.start < s2.start; }); + for (size_t i = 0; i + 1 < symbols.size(); ++i) { + symbols[i].end = symbols[i + 1].start; + } + return symbols; +} + +static std::string RawDataToHexString(const void* data, size_t size) { + const uint8_t* p = static_cast(data); + std::string s; + for (size_t i = 0; i < size; ++i) { + s += android::base::StringPrintf("%02x", p[i]); + } + return s; +} + +static void HexStringToRawData(const char* s, void* data, size_t size) { + uint8_t* p = static_cast(data); + for (size_t i = 0; i < size; ++i) { + int value; + sscanf(s, "%02x", &value); + *p++ = static_cast(value); + s += 2; + } +} + +struct OfflineThreadArg { + unw_context_t unw_context; + pid_t tid; + volatile int exit_flag; +}; + +static void* OfflineThreadFunc(void* arg) { + OfflineThreadArg* fn_arg = reinterpret_cast(arg); + fn_arg->tid = gettid(); + test_get_context_and_wait(&fn_arg->unw_context, &fn_arg->exit_flag); + return nullptr; +} + +// This test is disable because it is for generating test data. +TEST(libbacktrace, DISABLED_generate_offline_testdata) { // Create a thread to generate the needed stack and registers information. - g_exit_flag = false; - const size_t stack_size = 1024 * 1024; + const size_t stack_size = 16 * 1024; void* stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ASSERT_NE(MAP_FAILED, stack); uintptr_t stack_addr = reinterpret_cast(stack); @@ -86,18 +141,17 @@ static void OfflineBacktraceFunctionCall(const std::function(stack), stack_size)); pthread_t thread; OfflineThreadArg arg; - arg.function = function; + arg.exit_flag = 0; ASSERT_EQ(0, pthread_create(&thread, &attr, OfflineThreadFunc, &arg)); // Wait for the offline thread to generate the stack and unw_context information. sleep(1); // Copy the stack information. std::vector stack_data(reinterpret_cast(stack), reinterpret_cast(stack) + stack_size); - g_exit_flag = true; + arg.exit_flag = 1; ASSERT_EQ(0, pthread_join(thread, nullptr)); ASSERT_EQ(0, munmap(stack, stack_size)); - // Do offline backtrace. std::unique_ptr map(BacktraceMap::Create(getpid())); ASSERT_TRUE(map != nullptr); @@ -106,47 +160,44 @@ static void OfflineBacktraceFunctionCall(const std::function backtrace( - Backtrace::CreateOffline(getpid(), arg.tid, map.get(), stack_info)); - ASSERT_TRUE(backtrace != nullptr); - - ucontext_t ucontext = GetUContextFromUnwContext(arg.unw_context); - ASSERT_TRUE(backtrace->Unwind(0, &ucontext)); - - // Collect pc values of the call stack frames. - for (size_t i = 0; i < backtrace->NumFrames(); ++i) { - pc_values->push_back(backtrace->GetFrame(i)->pc); + // Generate offline testdata. + std::string testdata; + // 1. Dump pid, tid + testdata += android::base::StringPrintf("pid: %d tid: %d\n", getpid(), arg.tid); + // 2. Dump maps + for (auto it = map->begin(); it != map->end(); ++it) { + testdata += android::base::StringPrintf( + "map: start: %" PRIxPTR " end: %" PRIxPTR " offset: %" PRIxPTR + " load_base: %" PRIxPTR " flags: %d name: %s\n", + it->start, it->end, it->offset, it->load_base, it->flags, it->name.c_str()); } + // 3. Dump registers + testdata += android::base::StringPrintf("registers: %zu ", sizeof(arg.unw_context)); + testdata += RawDataToHexString(&arg.unw_context, sizeof(arg.unw_context)); + testdata.push_back('\n'); + + // 4. Dump stack + testdata += android::base::StringPrintf( + "stack: start: %" PRIx64 " end: %" PRIx64 " size: %zu ", + stack_info.start, stack_info.end, stack_data.size()); + testdata += RawDataToHexString(stack_data.data(), stack_data.size()); + testdata.push_back('\n'); + + // 5. Dump function symbols + std::vector function_symbols = GetFunctionSymbols(); + for (const auto& symbol : function_symbols) { + testdata += android::base::StringPrintf( + "function: start: %" PRIxPTR " end: %" PRIxPTR" name: %s\n", + symbol.start, symbol.end, symbol.name.c_str()); + } + + ASSERT_TRUE(android::base::WriteStringToFile(testdata, "offline_testdata")); } // Return the name of the function which matches the address. Although we don't know the // exact end of each function, it is accurate enough for the tests. -static std::string FunctionNameForAddress(uintptr_t addr) { - struct FunctionSymbol { - std::string name; - uintptr_t start; - uintptr_t end; - }; - - static std::vector symbols; - if (symbols.empty()) { - symbols = std::vector{ - {"unknown_start", 0, 0}, - {"test_level_one", reinterpret_cast(&test_level_one), 0}, - {"test_level_two", reinterpret_cast(&test_level_two), 0}, - {"test_level_three", reinterpret_cast(&test_level_three), 0}, - {"test_level_four", reinterpret_cast(&test_level_four), 0}, - {"test_recursive_call", reinterpret_cast(&test_recursive_call), 0}, - {"GetContextAndExit", reinterpret_cast(&GetContextAndExit), 0}, - {"unknown_end", static_cast(-1), static_cast(-1)}, - }; - std::sort( - symbols.begin(), symbols.end(), - [](const FunctionSymbol& s1, const FunctionSymbol& s2) { return s1.start < s2.start; }); - for (size_t i = 0; i + 1 < symbols.size(); ++i) { - symbols[i].end = symbols[i + 1].start; - } - } +static std::string FunctionNameForAddress(uintptr_t addr, + const std::vector& symbols) { for (auto& symbol : symbols) { if (addr >= symbol.start && addr < symbol.end) { return symbol.name; @@ -155,35 +206,136 @@ static std::string FunctionNameForAddress(uintptr_t addr) { return ""; } -TEST(libbacktrace, offline) { - std::function function = - std::bind(test_level_one, 1, 2, 3, 4, std::placeholders::_1, std::placeholders::_2); +static std::string GetArch() { +#if defined(__arm__) + return "arm"; +#elif defined(__aarch64__) + return "aarch64"; +#elif defined(__i386__) + return "x86"; +#elif defined(__x86_64__) + return "x86_64"; +#else + return ""; +#endif +} + +static void BacktraceOfflineTest(const std::string& testlib_name) { + const std::string arch = GetArch(); + if (arch.empty()) { + GTEST_LOG_(INFO) << "This test does nothing on current arch."; + return; + } + const std::string offline_testdata_path = "testdata/" + arch + "/offline_testdata"; + std::string testdata; + ASSERT_TRUE(android::base::ReadFileToString(offline_testdata_path, &testdata)); + + const std::string testlib_path = "testdata/" + arch + "/" + testlib_name; + struct stat st; + if (stat(testlib_path.c_str(), &st) == -1) { + GTEST_LOG_(INFO) << "This test is skipped as " << testlib_path << " doesn't exist."; + return; + } + + // Parse offline_testdata. + std::vector lines = android::base::Split(testdata, "\n"); + int pid; + int tid; + std::vector maps; + unw_context_t unw_context; + backtrace_stackinfo_t stack_info; + std::vector stack; + std::vector symbols; + for (const auto& line : lines) { + if (android::base::StartsWith(line, "pid:")) { + sscanf(line.c_str(), "pid: %d tid: %d", &pid, &tid); + } else if (android::base::StartsWith(line, "map:")) { + maps.resize(maps.size() + 1); + int pos; + sscanf(line.c_str(), + "map: start: %" SCNxPTR " end: %" SCNxPTR " offset: %" SCNxPTR + " load_base: %" SCNxPTR " flags: %d name: %n", + &maps.back().start, &maps.back().end, &maps.back().offset, + &maps.back().load_base, &maps.back().flags, &pos); + maps.back().name = android::base::Trim(line.substr(pos)); + } else if (android::base::StartsWith(line, "registers:")) { + size_t size; + int pos; + sscanf(line.c_str(), "registers: %zu %n", &size, &pos); + ASSERT_EQ(sizeof(unw_context), size); + HexStringToRawData(&line[pos], &unw_context, size); + } else if (android::base::StartsWith(line, "stack:")) { + size_t size; + int pos; + sscanf(line.c_str(), + "stack: start: %" SCNx64 " end: %" SCNx64 " size: %zu %n", + &stack_info.start, &stack_info.end, &size, &pos); + stack.resize(size); + HexStringToRawData(&line[pos], &stack[0], size); + stack_info.data = stack.data(); + } else if (android::base::StartsWith(line, "function:")) { + symbols.resize(symbols.size() + 1); + int pos; + sscanf(line.c_str(), + "function: start: %" SCNxPTR " end: %" SCNxPTR " name: %n", + &symbols.back().start, &symbols.back().end, + &pos); + symbols.back().name = line.substr(pos); + } + } + + // Fix path of libbacktrace_testlib.so. + for (auto& map : maps) { + if (map.name.find("libbacktrace_test.so") != std::string::npos) { + map.name = testlib_path; + } + } + + // Do offline backtrace. + std::unique_ptr map(BacktraceMap::Create(pid, maps)); + ASSERT_TRUE(map != nullptr); + + std::unique_ptr backtrace( + Backtrace::CreateOffline(pid, tid, map.get(), stack_info)); + ASSERT_TRUE(backtrace != nullptr); + + ucontext_t ucontext = GetUContextFromUnwContext(unw_context); + ASSERT_TRUE(backtrace->Unwind(0, &ucontext)); + + + // Collect pc values of the call stack frames. std::vector pc_values; - OfflineBacktraceFunctionCall(function, &pc_values); - ASSERT_FALSE(pc_values.empty()); - ASSERT_LE(pc_values.size(), static_cast(MAX_BACKTRACE_FRAMES)); + for (size_t i = 0; i < backtrace->NumFrames(); ++i) { + pc_values.push_back(backtrace->GetFrame(i)->pc); + } size_t test_one_index = 0; for (size_t i = 0; i < pc_values.size(); ++i) { - if (FunctionNameForAddress(pc_values[i]) == "test_level_one") { + if (FunctionNameForAddress(pc_values[i], symbols) == "test_level_one") { test_one_index = i; break; } } ASSERT_GE(test_one_index, 3u); - ASSERT_EQ("test_level_one", FunctionNameForAddress(pc_values[test_one_index])); - ASSERT_EQ("test_level_two", FunctionNameForAddress(pc_values[test_one_index - 1])); - ASSERT_EQ("test_level_three", FunctionNameForAddress(pc_values[test_one_index - 2])); - ASSERT_EQ("test_level_four", FunctionNameForAddress(pc_values[test_one_index - 3])); + ASSERT_EQ("test_level_one", FunctionNameForAddress(pc_values[test_one_index], symbols)); + ASSERT_EQ("test_level_two", FunctionNameForAddress(pc_values[test_one_index - 1], symbols)); + ASSERT_EQ("test_level_three", FunctionNameForAddress(pc_values[test_one_index - 2], symbols)); + ASSERT_EQ("test_level_four", FunctionNameForAddress(pc_values[test_one_index - 3], symbols)); } -TEST(libbacktrace, offline_max_trace) { - std::function function = std::bind( - test_recursive_call, MAX_BACKTRACE_FRAMES + 10, std::placeholders::_1, std::placeholders::_2); - std::vector pc_values; - OfflineBacktraceFunctionCall(function, &pc_values); - ASSERT_FALSE(pc_values.empty()); - ASSERT_EQ(static_cast(MAX_BACKTRACE_FRAMES), pc_values.size()); - ASSERT_EQ("test_recursive_call", FunctionNameForAddress(pc_values.back())); +TEST(libbacktrace, offline_eh_frame) { + BacktraceOfflineTest("libbacktrace_test_eh_frame.so"); +} + +TEST(libbacktrace, offline_debug_frame) { + BacktraceOfflineTest("libbacktrace_test_debug_frame.so"); +} + +TEST(libbacktrace, offline_gnu_debugdata) { + BacktraceOfflineTest("libbacktrace_test_gnu_debugdata.so"); +} + +TEST(libbacktrace, offline_arm_exidx) { + BacktraceOfflineTest("libbacktrace_test_arm_exidx.so"); } diff --git a/libbacktrace/backtrace_testlib.c b/libbacktrace/backtrace_testlib.c index d4d15dbba..6f6b53508 100644 --- a/libbacktrace/backtrace_testlib.c +++ b/libbacktrace/backtrace_testlib.c @@ -14,6 +14,7 @@ * limitations under the License. */ +#include #include int test_level_four(int one, int two, int three, int four, @@ -53,3 +54,23 @@ int test_recursive_call(int level, void (*callback_func)(void*), void* data) { } return 0; } + +typedef struct { + unw_context_t* unw_context; + volatile int* exit_flag; +} GetContextArg; + +static void GetContextAndExit(void* data) { + GetContextArg* arg = (GetContextArg*)data; + unw_getcontext(arg->unw_context); + // Don't touch the stack anymore. + while (*arg->exit_flag == 0) { + } +} + +void test_get_context_and_wait(unw_context_t* unw_context, volatile int* exit_flag) { + GetContextArg arg; + arg.unw_context = unw_context; + arg.exit_flag = exit_flag; + test_level_one(1, 2, 3, 4, GetContextAndExit, &arg); +} diff --git a/libbacktrace/testdata/aarch64/libbacktrace_test_eh_frame.so b/libbacktrace/testdata/aarch64/libbacktrace_test_eh_frame.so new file mode 100755 index 0000000000000000000000000000000000000000..880f33796d5627deebaa74768507f548624d094a GIT binary patch literal 12232 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 XGVYF__G>fge}9>+f7qqqLdAarZ$I&* literal 0 HcmV?d00001 diff --git a/libbacktrace/testdata/aarch64/offline_testdata b/libbacktrace/testdata/aarch64/offline_testdata new file mode 100644 index 000000000..ba44e0990 --- /dev/null +++ b/libbacktrace/testdata/aarch64/offline_testdata @@ -0,0 +1,107 @@ +pid: 32438 tid: 32439 +map: start: 557066e000 end: 55706ee000 offset: 0 load_base: 0 flags: 5 name: /data/backtrace_test64 +map: start: 55706ef000 end: 55706f2000 offset: 80000 load_base: 0 flags: 1 name: /data/backtrace_test64 +map: start: 55706f2000 end: 55706f3000 offset: 83000 load_base: 0 flags: 3 name: /data/backtrace_test64 +map: start: 7014200000 end: 7014600000 offset: 0 load_base: 0 flags: 3 name: [anon:libc_malloc] +map: start: 701464c000 end: 701465c000 offset: 0 load_base: 0 flags: 5 name: /system/lib64/libcutils.so +map: start: 701465c000 end: 701465d000 offset: 0 load_base: 0 flags: 0 name: +map: start: 701465d000 end: 701465e000 offset: 10000 load_base: 0 flags: 1 name: /system/lib64/libcutils.so +map: start: 701465e000 end: 701465f000 offset: 11000 load_base: 0 flags: 3 name: /system/lib64/libcutils.so +map: start: 7014691000 end: 70146b5000 offset: 0 load_base: 0 flags: 5 name: /system/lib64/liblzma.so +map: start: 70146b5000 end: 70146b6000 offset: 23000 load_base: 0 flags: 1 name: /system/lib64/liblzma.so +map: start: 70146b6000 end: 70146b7000 offset: 24000 load_base: 0 flags: 3 name: /system/lib64/liblzma.so +map: start: 70146b7000 end: 70146bc000 offset: 0 load_base: 0 flags: 3 name: [anon:.bss] +map: start: 70146c9000 end: 70158b5000 offset: 0 load_base: af000 flags: 5 name: /system/lib64/libLLVM.so +map: start: 70158b5000 end: 701596b000 offset: 11eb000 load_base: 0 flags: 1 name: /system/lib64/libLLVM.so +map: start: 701596b000 end: 701596c000 offset: 12a1000 load_base: 0 flags: 3 name: /system/lib64/libLLVM.so +map: start: 701596c000 end: 701599f000 offset: 0 load_base: 0 flags: 3 name: [anon:.bss] +map: start: 70159c2000 end: 70159f9000 offset: 0 load_base: 0 flags: 5 name: /system/lib64/libm.so +map: start: 70159f9000 end: 70159fa000 offset: 36000 load_base: 0 flags: 1 name: /system/lib64/libm.so +map: start: 70159fa000 end: 70159fb000 offset: 37000 load_base: 0 flags: 3 name: /system/lib64/libm.so +map: start: 7015a1e000 end: 7015a2e000 offset: 0 load_base: 0 flags: 5 name: /system/lib64/libbacktrace.so +map: start: 7015a2e000 end: 7015a2f000 offset: f000 load_base: 0 flags: 1 name: /system/lib64/libbacktrace.so +map: start: 7015a2f000 end: 7015a30000 offset: 10000 load_base: 0 flags: 3 name: /system/lib64/libbacktrace.so +map: start: 7015a5e000 end: 7015a7d000 offset: 0 load_base: 1000 flags: 5 name: /system/lib64/libutils.so +map: start: 7015a7d000 end: 7015a7e000 offset: 0 load_base: 0 flags: 0 name: +map: start: 7015a7e000 end: 7015a7f000 offset: 1f000 load_base: 0 flags: 1 name: /system/lib64/libutils.so +map: start: 7015a7f000 end: 7015a80000 offset: 20000 load_base: 0 flags: 3 name: /system/lib64/libutils.so +map: start: 7015a99000 end: 7015b6d000 offset: 0 load_base: 9000 flags: 5 name: /system/lib64/libc++.so +map: start: 7015b6d000 end: 7015b6e000 offset: 0 load_base: 0 flags: 0 name: +map: start: 7015b6e000 end: 7015b76000 offset: d4000 load_base: 0 flags: 1 name: /system/lib64/libc++.so +map: start: 7015b76000 end: 7015b77000 offset: dc000 load_base: 0 flags: 3 name: /system/lib64/libc++.so +map: start: 7015b77000 end: 7015b7a000 offset: 0 load_base: 0 flags: 3 name: [anon:.bss] +map: start: 7015b81000 end: 7015b92000 offset: 0 load_base: 0 flags: 5 name: /system/lib64/liblog.so +map: start: 7015b92000 end: 7015b93000 offset: 10000 load_base: 0 flags: 1 name: /system/lib64/liblog.so +map: start: 7015b93000 end: 7015b94000 offset: 11000 load_base: 0 flags: 3 name: /system/lib64/liblog.so +map: start: 7015be3000 end: 7015ca3000 offset: 0 load_base: 0 flags: 5 name: /system/lib64/libc.so +map: start: 7015ca3000 end: 7015ca9000 offset: bf000 load_base: 0 flags: 1 name: /system/lib64/libc.so +map: start: 7015ca9000 end: 7015cab000 offset: c5000 load_base: 0 flags: 3 name: /system/lib64/libc.so +map: start: 7015cab000 end: 7015cac000 offset: 0 load_base: 0 flags: 3 name: [anon:.bss] +map: start: 7015cac000 end: 7015cad000 offset: 0 load_base: 0 flags: 1 name: [anon:.bss] +map: start: 7015cad000 end: 7015cb4000 offset: 0 load_base: 0 flags: 3 name: [anon:.bss] +map: start: 7015cf5000 end: 7015cf6000 offset: 0 load_base: 0 flags: 5 name: /data/libbacktrace_test.so +map: start: 7015cf6000 end: 7015cf7000 offset: 0 load_base: 0 flags: 1 name: /data/libbacktrace_test.so +map: start: 7015cf7000 end: 7015cf8000 offset: 1000 load_base: 0 flags: 3 name: /data/libbacktrace_test.so +map: start: 7015d1f000 end: 7015d39000 offset: 0 load_base: 0 flags: 5 name: /system/lib64/libunwind.so +map: start: 7015d39000 end: 7015d3a000 offset: 19000 load_base: 0 flags: 1 name: /system/lib64/libunwind.so +map: start: 7015d3a000 end: 7015d3b000 offset: 1a000 load_base: 0 flags: 3 name: /system/lib64/libunwind.so +map: start: 7015d3b000 end: 7015da4000 offset: 0 load_base: 0 flags: 3 name: [anon:.bss] +map: start: 7015de8000 end: 7015df7000 offset: 0 load_base: 0 flags: 5 name: /system/lib64/libbase.so +map: start: 7015df7000 end: 7015df8000 offset: 0 load_base: 0 flags: 0 name: +map: start: 7015df8000 end: 7015df9000 offset: f000 load_base: 0 flags: 1 name: /system/lib64/libbase.so +map: start: 7015df9000 end: 7015dfa000 offset: 10000 load_base: 0 flags: 3 name: /system/lib64/libbase.so +map: start: 7015e35000 end: 7015e36000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc] +map: start: 7015e4f000 end: 7015e50000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_small_objects] +map: start: 7015f11000 end: 7015f13000 offset: 0 load_base: 0 flags: 5 name: /system/lib64/libnetd_client.so +map: start: 7015f13000 end: 7015f14000 offset: 1000 load_base: 0 flags: 1 name: /system/lib64/libnetd_client.so +map: start: 7015f14000 end: 7015f15000 offset: 2000 load_base: 0 flags: 3 name: /system/lib64/libnetd_client.so +map: start: 7015f6c000 end: 7015f79000 offset: 0 load_base: 0 flags: 3 name: +map: start: 7015f79000 end: 7015f99000 offset: 0 load_base: 0 flags: 32769 name: /dev/__properties__/u:object_r:default_prop:s0 +map: start: 7015f99000 end: 7015f9a000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_vector] +map: start: 7015f9a000 end: 7015f9b000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_small_objects] +map: start: 7015fa6000 end: 7015fa7000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_vector] +map: start: 7015fa8000 end: 7015fa9000 offset: 0 load_base: 0 flags: 1 name: [anon:linker_alloc] +map: start: 7015faf000 end: 7015fcf000 offset: 0 load_base: 0 flags: 32769 name: /dev/__properties__/properties_serial +map: start: 7015fcf000 end: 7015fd0000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_vector] +map: start: 7015fd0000 end: 7015fd1000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_small_objects] +map: start: 7015fd1000 end: 7015fd2000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_vector] +map: start: 7015fd4000 end: 7015fd7000 offset: 0 load_base: 0 flags: 3 name: +map: start: 7015fd7000 end: 7015fdb000 offset: 0 load_base: 0 flags: 1 name: [anon:atexit handlers] +map: start: 7015fdb000 end: 7015fdc000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc] +map: start: 7015fdc000 end: 7015fdd000 offset: 0 load_base: 0 flags: 3 name: +map: start: 7015fdd000 end: 7015fde000 offset: 0 load_base: 0 flags: 1 name: [anon:linker_alloc] +map: start: 7015fde000 end: 7015ffe000 offset: 0 load_base: 0 flags: 32769 name: /dev/__properties__/u:object_r:debug_prop:s0 +map: start: 7015ffe000 end: 701601e000 offset: 0 load_base: 0 flags: 32769 name: /dev/__properties__/properties_serial +map: start: 701601e000 end: 701601f000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_vector] +map: start: 701601f000 end: 7016020000 offset: 0 load_base: 0 flags: 0 name: +map: start: 7016020000 end: 7016021000 offset: 0 load_base: 0 flags: 3 name: +map: start: 7016021000 end: 7016022000 offset: 0 load_base: 0 flags: 0 name: +map: start: 7016022000 end: 7016023000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_lob] +map: start: 7016023000 end: 7016025000 offset: 0 load_base: 0 flags: 1 name: [anon:linker_alloc] +map: start: 7016025000 end: 7016026000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_small_objects] +map: start: 7016026000 end: 7016027000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_vector] +map: start: 7016027000 end: 7016028000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_small_objects] +map: start: 7016028000 end: 7016029000 offset: 0 load_base: 0 flags: 3 name: [anon:arc4random data] +map: start: 7016029000 end: 701602a000 offset: 0 load_base: 0 flags: 3 name: [anon:linker_alloc_small_objects] +map: start: 701602a000 end: 701602b000 offset: 0 load_base: 0 flags: 1 name: [anon:atexit handlers] +map: start: 701602b000 end: 701602c000 offset: 0 load_base: 0 flags: 0 name: [anon:thread signal stack guard page] +map: start: 701602c000 end: 7016030000 offset: 0 load_base: 0 flags: 3 name: [anon:thread signal stack] +map: start: 7016030000 end: 7016031000 offset: 0 load_base: 0 flags: 3 name: [anon:arc4random data] +map: start: 7016031000 end: 7016033000 offset: 0 load_base: 0 flags: 5 name: [vdso] +map: start: 7016033000 end: 70160dd000 offset: 0 load_base: 0 flags: 5 name: /system/bin/linker64 +map: start: 70160dd000 end: 70160e0000 offset: a9000 load_base: 0 flags: 1 name: /system/bin/linker64 +map: start: 70160e0000 end: 70160e1000 offset: ac000 load_base: 0 flags: 3 name: /system/bin/linker64 +map: start: 70160e1000 end: 70160e4000 offset: 0 load_base: 0 flags: 3 name: +map: start: 70160e4000 end: 70160e5000 offset: 0 load_base: 0 flags: 1 name: +map: start: 70160e5000 end: 70160e8000 offset: 0 load_base: 0 flags: 3 name: +map: start: 7fd8baf000 end: 7fd8be6000 offset: 0 load_base: 0 flags: 3 name: [stack] +registers: 4560 679a0b1670000000f3eb6d705500000090f56e7055000000000000000000000000206f705500000014e0677055000000d038bed87f0000004cde67705500000041000000000000001900000000000000c00f241470000000d3aec914588f4bcd0400000000000000e493af157000000090f56e7055000000060000000000000023c00b1670000000b1d1fd15700000003039bed87f000000c898041670000000304cbed87f000000b8130e1670000000303cbed87f000000f838bed87f0000000e0000000000000015000000000000001c00000000000000ec59cf1570000000b863fd15700000005064fd15700000000000000000000000ec59cf15700000000200000000000000b863fd1570000000144abed87f0000006064fd15700000005064fd157000000000010000000000005826bed87f000000d86fcf15700000006057cf157000000000000000000000005064fd15700000005064fd15700000005064fd1570000000b67e00000000000040fd677055000000d064fd15700000000030fd157000000002000000000000000100000000000000fcb58a56000000000063fd15700000009857cf1570000000c062fd15700000001c5acf157000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000003003167000000001000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000033000000000000000300000000000000003303167000000008330316700000000000000006000000f8320316700000005839bed87f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000c84cbed87f000000e84cbed87f000000984dbed87f00000078170e167000000002fd0000000000001400000000000000ff8100000100000000000000000000000000000000000000000000000000000078145700000000000010000000000000902b000000000000bdd04058000000000000000000000000bdd04058000000000000000000000000ccb58a560000000042487408000000000000000000000000cc57041670000000004704167000000010c0fd157000000010c0fd157000000090c0fd15700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000010000000000000002f48bed87f000000d3aec914588f4bcd2045bed87f0000002045bed87f0000002f48bed87f00000001000000000000002f000080000000005045bed87f0000000045bed87f000000c0a0c315700000006045bed87f0000006045bed87f000000010000000000000001000000000000000344bed87f00000001000000100000009c3fbed87f0000009b3fbed87f0000000344bed87f0000009a3fbed87f0000000100000000000000953fbed87f0000004344bed80100000001000000010000002c48bed87f0000000444bed87f0000004344bed80100000000000000000000000100000000000000b03fbed87f000000000000000200000000000000000000000000000000000000d3aec914588f4bcd000000000100000000000000000000000100000000000000f03fbed87f000000000000000200000000000000000000000000000000000000d3aec914588f4bcd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a03fbed87f0000000000000000000000000000000000000000000000000000000000000000000000d3aec914588f4bcd08226f70550000000000000000000000000000000000000000000000000000001048bed87f0000008047bed87f0000006047bed87f000000e0ffffff80ffffff03000000000000000000000000000000891d6e7055000000d3aec914588f4bcd5047bed87f0000005047bed87f000000861d6e705500000003000000000000002f00008000000000f0a6ca15700000004047bed87f000000c0a0c31570000000891d6e7055000000d3aec914000000000100000000000000a047bed800000000f9006e70550000000100000000000000dc41bed87f000000db41bed87f0000004346bed87f000000da41bed87f0000000100000000000000d541bed87f00000001000000010000000100000001000000861d6e70550000004446bed87f0000002c42bed80300000000000000000000000100000000000000f041bed87f0000009b1e6e700100000000000000000000000000000000000000d3aec914588f4bcd8e1e6e70550000000d000000000000002f00008000000000f0a6ca15700000003048bed87f000000c0a0c31570000000661e6e700100000000000000000000002f000000000000001000000000000000e21e6e7055000000d3aec914588f4bcdb048bed87f000000b048bed87f000000e21e6e70550000002f000000000000002f00008000000000f0a6ca1570000000a048bed87f000000c0a0c315700000008e1e6e7055000000000000000000000022000000000000000000000000000000205827147000000022000000000000003c43bed87f0000003b43bed87f000000a347bed87f0000003a43bed87f00000001000000000000003543bed87f000000f048bed8010000000100000001000000dd1e6e7055000000a447bed87f0000008c43bed82f000000000000000000000001000000000000005043bed87f000000861d6e700300000000000000000000000000000000000000d3aec914588f4bcd721e6e7055000000f447bed87f000000981123141800000000000000000000000100000000000000a043bed87f000000861d6e70030000000000000000000000d042bed87f0000000000000000000000981123147000000098112314700000009811231470000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000504abed87f000000b049bed87f0000008049bed87f00000000000000000000004043bed87f0000000000000000000000991123147000000000000000000000008e1e6e70550000000d00000000000000a04abed87f000000000000000000000000000000000000000000000000000000504abed87f000000e049bed87f000000a049bed87f000000c8ffffff80ffffff591e6e70550000000d0000000000000098112314700000000000000000000000df1e6e7055000000010000000000000020582714700000002200000000000000f049bed87f000000c8ffffff80ffffff9811231470000000980023147000000098112314700000009811231470000000741e6e7055000000060000000000000009f12914700000000c00000000000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b149bed87f000000b149bed87f000000f049be317f000000f049bed87f000000f049bed87f000000b149bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000f149bed87f000000f049bed87f000000d3aec914588f4bcdfcb58a56000000006cbb687055000000160000000000000098112314700000009911231470000000991123147000000098112314700000009911231470000000fcb58a5600000000010000000000000000000000000000000100000000000000604a050000000000e845bed87f0000006048bed87f000000a046bed87f00000017000000000000002c48bed87f0000009046bed87f000000ac73c515700000009911231470000000d3aec914588f4bcd1048bed87f0000008047bed87f0000006047bed87f000000e8ffffff80ffffffffffffffffffffff99112314700000006148bed87f000000981123141500000008020000ffffffff6048bed87f000000160000000000000058112314700000001700000000000000a849bed87f0000000000000000000000284abed87f0000001700000000000000284abed87f000000284abed87f000000d249bed87f00000001000000000000009a112314700000001600000000000000284abed87f000000ffffffffffffffff284abed87f000000284abed87f000000284abed87f000000284abed87f0000001700000000000000ffffffffffffffff284abed87f000000284abed87f000000ff49bed87f000000284abed87f00000000000000000000000000000000000000d049bed87f000000d049bed87f000000004abed87f000000d049bed87f0000000100000000000000d049bed87f000000d049bed87f000000d049bed87f00000017000000000000000100000000000000ffffffffffffffff991123147000000001000000000000003448bed87f0000009911231470000000b0ca687055000000ffffffffffffffff010000000000000099112314700000007047bed87f000000d3aec914588f4bcdfcb58a56000000000100000000000000000000000000000050226f70550000000000000000000000b44b05000000000000102a1470000000861d6e70550000000300000000000000f0a6ca1570000000a047bed87f0000006c79c31570000000f048bed87f0000008048bed87f0000004048bed87f000000c8ffffff80ffffff0000000000000000d3aec914588f4bcdf849bed87f000000f0a6ca15700000000200000000000000085b0e1670000000e048bed87f0000002c6fc515700000009048bed87f000000d3aec914588f4bcd0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a89912314700000000000000000000000e9216f70550000008991231470000000e449bed87f0000008991231470000000000000000000000000000000000000008891231470000000899123147000000089912314700000008891231470000000170000000000000088912314700000008891231470000000d3aec914588f4bcd899123147000000016000000000000000000000000000000e9216f705500000088912314700000008891231470000000889123147000000088912314700000008891231470000000f0a6ca15700000000049bed87f0000006c79c31570000000889123147000000088912314700000008891231470000000889123147000000088912314700000008891231470000000889123147000000089912314700000008991231470000000085b0e1670000000404abed87f0000002c6fc51570000000c80a6f7055000000d3aec914588f4bcd0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a3b3325736d001b5b6d002c20776865726520002573203d202573000a526570650000000000000000000000000000000000000000000000008891231470000000000000000000000088912314700000008891231470000000889123147000000088912314700000000000000000000000889123147000000088912314700000008891231470000000470000000000000000502a1470000000d3aec914588f4bcdf05727147000000000b2221470000000604abed87f0000005c716c7055000000fcb58a56000000007c706c7055000000fcb58a5600000000ea4b050000000000 +stack: start: 7015fd3000 end: 7015fd7000 size: 16384 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f838bed87f0000004038bed87f000000b863fd1570000000b863fd1570000000b863fd1570000000ec59cf15700000001c000000150000000e000000070000003063fd15700000001c58cf1570000000b863fd1570000000ec59cf1570000000100000000c00000008000000040000006063fd15700000007c58cf1570000000b863fd1570000000ec59cf1570000000080000000600000004000000020000009063fd1570000000dc58cf1570000000b863fd1570000000ec59cf157000000004000000030000000200000001000000d063fd1570000000c459cf15700000000100000000000000144abed87f0000004038bed87f0000004038bed87f000000144abed87f000000d3aec914588f4bcd1064fd157000000074fd6770550000004038bed87f0000004038bed87f000000ec84c41570000000e484c41570000000c484c4157000000000000000000000004064fd15700000004015c01570000000b67e0000000000000000000000000000705a0e1670000000185b0e167000000000000000000000000000000000000000705a0e16700000000000000000000000b77e0000b67e000000000000550000000030fd157000000050340000000000000010000000000000000000000000000000b222147000000000102a14700000000000000000000000000000000000000040fd6770550000004038bed87f000000000000000000000000a0fa1570000000010000000000000000000000000000000000000000000000e864fd15700000005064fd1570000000000000000000000000000000000000000000000000000000d3aec914588f4bcd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +function: start: 0 end: 7015cf5760 name: unknown_start +function: start: 7015cf5760 end: 7015cf57cc name: test_level_four +function: start: 7015cf57cc end: 7015cf582c name: test_level_three +function: start: 7015cf582c end: 7015cf588c name: test_level_two +function: start: 7015cf588c end: 7015cf58ec name: test_level_one +function: start: 7015cf58ec end: 7015cf5968 name: test_recursive_call +function: start: 7015cf5968 end: ffffffffffffffff name: test_get_context_and_wait +function: start: ffffffffffffffff end: ffffffffffffffff name: unknown_end diff --git a/libbacktrace/testdata/arm/libbacktrace_test_arm_exidx.so b/libbacktrace/testdata/arm/libbacktrace_test_arm_exidx.so new file mode 100755 index 0000000000000000000000000000000000000000..454b0320a0818aefa389d5e39e00ed8e3a6c4f1c GIT binary patch literal 13804 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 literal 0 HcmV?d00001 diff --git a/libbacktrace/testdata/arm/libbacktrace_test_gnu_debugdata.so b/libbacktrace/testdata/arm/libbacktrace_test_gnu_debugdata.so new file mode 100755 index 0000000000000000000000000000000000000000..9340d9882f5799faa6328db3cc136331834ec1e0 GIT binary patch literal 36456 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

-uax&9AR=Gc?`^(fO9)M^;Hbn(-37 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 literal 0 HcmV?d00001 diff --git a/libbacktrace/testdata/x86/offline_testdata b/libbacktrace/testdata/x86/offline_testdata new file mode 100644 index 000000000..3e4e06c52 --- /dev/null +++ b/libbacktrace/testdata/x86/offline_testdata @@ -0,0 +1,82 @@ +pid: 34545 tid: 34546 +map: start: f705a000 end: f705c000 offset: 0 load_base: 0 flags: 3 name: +map: start: f705c000 end: f707f000 offset: 0 load_base: 0 flags: 5 name: /ssd/android/aosp_master/out/host/linux-x86/lib/liblzma.so +map: start: f707f000 end: f7080000 offset: 22000 load_base: 0 flags: 1 name: /ssd/android/aosp_master/out/host/linux-x86/lib/liblzma.so +map: start: f7080000 end: f7081000 offset: 23000 load_base: 0 flags: 3 name: /ssd/android/aosp_master/out/host/linux-x86/lib/liblzma.so +map: start: f7081000 end: f7088000 offset: 0 load_base: 0 flags: 3 name: +map: start: f7088000 end: f7230000 offset: 0 load_base: 0 flags: 5 name: /lib/i386-linux-gnu/libc-2.19.so +map: start: f7230000 end: f7231000 offset: 1a8000 load_base: 0 flags: 0 name: /lib/i386-linux-gnu/libc-2.19.so +map: start: f7231000 end: f7233000 offset: 1a8000 load_base: 0 flags: 1 name: /lib/i386-linux-gnu/libc-2.19.so +map: start: f7233000 end: f7234000 offset: 1aa000 load_base: 0 flags: 3 name: /lib/i386-linux-gnu/libc-2.19.so +map: start: f7234000 end: f7237000 offset: 0 load_base: 0 flags: 3 name: +map: start: f7237000 end: f727b000 offset: 0 load_base: 0 flags: 5 name: /lib/i386-linux-gnu/libm-2.19.so +map: start: f727b000 end: f727c000 offset: 43000 load_base: 0 flags: 1 name: /lib/i386-linux-gnu/libm-2.19.so +map: start: f727c000 end: f727d000 offset: 44000 load_base: 0 flags: 3 name: /lib/i386-linux-gnu/libm-2.19.so +map: start: f727d000 end: f7299000 offset: 0 load_base: 0 flags: 5 name: /lib/i386-linux-gnu/libgcc_s.so.1 +map: start: f7299000 end: f729a000 offset: 1b000 load_base: 0 flags: 3 name: /lib/i386-linux-gnu/libgcc_s.so.1 +map: start: f729a000 end: f72b8000 offset: 0 load_base: 0 flags: 5 name: /lib/i386-linux-gnu/libtinfo.so.5.9 +map: start: f72b8000 end: f72b9000 offset: 1e000 load_base: 0 flags: 0 name: /lib/i386-linux-gnu/libtinfo.so.5.9 +map: start: f72b9000 end: f72bb000 offset: 1e000 load_base: 0 flags: 1 name: /lib/i386-linux-gnu/libtinfo.so.5.9 +map: start: f72bb000 end: f72bc000 offset: 20000 load_base: 0 flags: 3 name: /lib/i386-linux-gnu/libtinfo.so.5.9 +map: start: f72bc000 end: f72bd000 offset: 0 load_base: 0 flags: 3 name: +map: start: f72bd000 end: f72e0000 offset: 0 load_base: 0 flags: 5 name: /lib/i386-linux-gnu/libncurses.so.5.9 +map: start: f72e0000 end: f72e1000 offset: 22000 load_base: 0 flags: 1 name: /lib/i386-linux-gnu/libncurses.so.5.9 +map: start: f72e1000 end: f72e2000 offset: 23000 load_base: 0 flags: 3 name: /lib/i386-linux-gnu/libncurses.so.5.9 +map: start: f72e2000 end: f72e5000 offset: 0 load_base: 0 flags: 5 name: /lib/i386-linux-gnu/libdl-2.19.so +map: start: f72e5000 end: f72e6000 offset: 2000 load_base: 0 flags: 1 name: /lib/i386-linux-gnu/libdl-2.19.so +map: start: f72e6000 end: f72e7000 offset: 3000 load_base: 0 flags: 3 name: /lib/i386-linux-gnu/libdl-2.19.so +map: start: f72e7000 end: f72ee000 offset: 0 load_base: 0 flags: 5 name: /lib/i386-linux-gnu/librt-2.19.so +map: start: f72ee000 end: f72ef000 offset: 6000 load_base: 0 flags: 1 name: /lib/i386-linux-gnu/librt-2.19.so +map: start: f72ef000 end: f72f0000 offset: 7000 load_base: 0 flags: 3 name: /lib/i386-linux-gnu/librt-2.19.so +map: start: f72f0000 end: f7308000 offset: 0 load_base: 0 flags: 5 name: /lib/i386-linux-gnu/libpthread-2.19.so +map: start: f7308000 end: f7309000 offset: 18000 load_base: 0 flags: 1 name: /lib/i386-linux-gnu/libpthread-2.19.so +map: start: f7309000 end: f730a000 offset: 19000 load_base: 0 flags: 3 name: /lib/i386-linux-gnu/libpthread-2.19.so +map: start: f730a000 end: f730c000 offset: 0 load_base: 0 flags: 3 name: +map: start: f732f000 end: f7331000 offset: 0 load_base: 0 flags: 3 name: +map: start: f7331000 end: f7425000 offset: 0 load_base: 0 flags: 5 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libc++.so +map: start: f7425000 end: f7426000 offset: f4000 load_base: 0 flags: 0 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libc++.so +map: start: f7426000 end: f742a000 offset: f4000 load_base: 0 flags: 1 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libc++.so +map: start: f742a000 end: f742b000 offset: f8000 load_base: 0 flags: 3 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libc++.so +map: start: f742b000 end: f742d000 offset: 0 load_base: 0 flags: 3 name: +map: start: f742d000 end: f7446000 offset: 0 load_base: 0 flags: 5 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libunwind.so +map: start: f7446000 end: f7447000 offset: 18000 load_base: 0 flags: 1 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libunwind.so +map: start: f7447000 end: f7448000 offset: 19000 load_base: 0 flags: 3 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libunwind.so +map: start: f7448000 end: f7457000 offset: 0 load_base: 0 flags: 3 name: +map: start: f7457000 end: f745c000 offset: 0 load_base: 0 flags: 5 name: /ssd/android/aosp_master/out/host/linux-x86/lib/liblog.so +map: start: f745c000 end: f745d000 offset: 4000 load_base: 0 flags: 1 name: /ssd/android/aosp_master/out/host/linux-x86/lib/liblog.so +map: start: f745d000 end: f745e000 offset: 5000 load_base: 0 flags: 3 name: /ssd/android/aosp_master/out/host/linux-x86/lib/liblog.so +map: start: f745e000 end: f7467000 offset: 0 load_base: 0 flags: 5 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libcutils.so +map: start: f7467000 end: f7468000 offset: 9000 load_base: 0 flags: 0 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libcutils.so +map: start: f7468000 end: f7469000 offset: 9000 load_base: 0 flags: 1 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libcutils.so +map: start: f7469000 end: f746a000 offset: a000 load_base: 0 flags: 3 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libcutils.so +map: start: f746a000 end: f7477000 offset: 0 load_base: 0 flags: 5 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libbase.so +map: start: f7477000 end: f7478000 offset: c000 load_base: 0 flags: 1 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libbase.so +map: start: f7478000 end: f7479000 offset: d000 load_base: 0 flags: 3 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libbase.so +map: start: f7479000 end: f7489000 offset: 0 load_base: 0 flags: 5 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libbacktrace.so +map: start: f7489000 end: f748a000 offset: f000 load_base: 0 flags: 1 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libbacktrace.so +map: start: f748a000 end: f748b000 offset: 10000 load_base: 0 flags: 3 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libbacktrace.so +map: start: f748b000 end: f748c000 offset: 0 load_base: 0 flags: 3 name: +map: start: f748c000 end: f748d000 offset: 0 load_base: 0 flags: 5 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libbacktrace_test.so +map: start: f748d000 end: f748e000 offset: 0 load_base: 0 flags: 1 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libbacktrace_test.so +map: start: f748e000 end: f748f000 offset: 1000 load_base: 0 flags: 3 name: /ssd/android/aosp_master/out/host/linux-x86/lib/libbacktrace_test.so +map: start: f748f000 end: f7491000 offset: 0 load_base: 0 flags: 3 name: +map: start: f7491000 end: f74b1000 offset: 0 load_base: 0 flags: 5 name: /lib/i386-linux-gnu/ld-2.19.so +map: start: f74b1000 end: f74b2000 offset: 1f000 load_base: 0 flags: 1 name: /lib/i386-linux-gnu/ld-2.19.so +map: start: f74b2000 end: f74b3000 offset: 20000 load_base: 0 flags: 3 name: /lib/i386-linux-gnu/ld-2.19.so +map: start: f74b3000 end: f77c6000 offset: 0 load_base: 0 flags: 5 name: /ssd/android/aosp_master/out/host/linux-x86/nativetest/backtrace_test/backtrace_test32 +map: start: f77c6000 end: f77c7000 offset: 0 load_base: ffffe000 flags: 5 name: [vdso] +map: start: f77c7000 end: f77d4000 offset: 313000 load_base: 0 flags: 1 name: /ssd/android/aosp_master/out/host/linux-x86/nativetest/backtrace_test/backtrace_test32 +map: start: f77d4000 end: f77d5000 offset: 320000 load_base: 0 flags: 3 name: /ssd/android/aosp_master/out/host/linux-x86/nativetest/backtrace_test/backtrace_test32 +map: start: f77d5000 end: f77d6000 offset: 0 load_base: 0 flags: 3 name: +map: start: f7ec6000 end: f7ee7000 offset: 0 load_base: 0 flags: 3 name: [heap] +map: start: ffe4e000 end: ffe70000 offset: 0 load_base: 0 flags: 3 name: [stack] +registers: 348 00000000abdae6fff83b7df704000000a6ec77f7abdae6ff00000000afdae6ff78dae6ff150000001c000000b8f132f7a0f132f7d0df48f7a0ca48f728d9e6ff000000008c8decf78c8decf7ceca48f7a8dae6ff8d8decf70a0000000000000014dae6ff8c8decf78c8decf78c8decf78c8decf78c8decf7a9dae6ff06000000c03a23f78c8decf78c8decf78c8decf78c8decf78c8decf78c8decf78c8decf78d8decf78d8decf7c03a23f7543b23f7000033f75f5f0ff7c03a23f7503423f77000000098000000020000000f2700006c0000000e00000080000000000000008c8decf7000000008c8decf77f03ffff0000ffffffffffff0000000000000000000000000000ffff040000000f27000008000000003023f78d8decf7f069ec000046bdaa308decf715537df7f83b7df78c8decf74c1c71f78c8decf715537df70000000000000000f069ecf7f83b7df75064ecf792e671f7f069ecf7 +stack: start: f732c000 end: f7330000 size: 16384 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d9d49f761b009f71e382ff7000000000000000000000000000000000000000002000000f6372ff704c82bf70000000000204bf7f0a908f7ceca48f728d9e6fff4a449f70000000020f332f720f332f7d0df48f7f8f132f794c748f720f332f70c144205978142a8d4be08f7d0df48f720f332f7a0ca48f71c000000150000000e000000070000001c000000a0ca48f7d0df48f748f232f739c848f7070000000e000000150000001c000000a0ca48f720f332f70000000000000000d0df48f720f332f7a0ca48f7100000000c000000080000000400000010000000a0ca48f7d0df48f798f232f7c9c848f704000000080000000c00000010000000a0ca48f720f332f70000000000000000d0df48f720f332f7a0ca48f70800000006000000040000000200000008000000a0ca48f7d0df48f7e8f232f759c948f702000000040000000600000008000000a0ca48f720f332f70000000000000000d0df48f720f332f7a0ca48f7040000000300000002000000010000000046bdaa00000000d0df48f738f332f77cca48f701000000020000000300000004000000a0ca48f720f332f700000000f83b7df7696d4df7d0df48f788dae6ff28d9e6ff28d9e6ff88dae6ff58f332f70046bdaa40fb32f7f83b7df758f332f78d6d4df728d9e6ff88dae6fff83b7df728d9e6ff28d9e6ff009030f728f432f7726f2ff728d9e6ff40fb32f740fb32f740fb32f790f332f700000000000000000000000000000000000000000000000000000000009030f740fb32f7000f3d0028f432f703b12c75032f144e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a06e2ff700000000000f3d00000000008e3f17f740fb32f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a03823f7c4fd32f700000000e0341df7e02e1df7e03d1df70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040fb32f7188eecf740fb32f70100000030647cf70046bdaa28658876000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a705f7a4b130f7f2860000f1860000b0fb32f7ecffffff000000000000000090f332f7000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccfb32f70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c2638cfa7f3e1d0000000000000000000000000000000000406d4df728d9e6ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c032f7004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +function: start: 0 end: f748c740 name: unknown_start +function: start: f748c740 end: f748c7c0 name: test_level_four +function: start: f748c7c0 end: f748c850 name: test_level_three +function: start: f748c850 end: f748c8e0 name: test_level_two +function: start: f748c8e0 end: f748c970 name: test_level_one +function: start: f748c970 end: f748ca10 name: test_recursive_call +function: start: f748ca10 end: ffffffff name: test_get_context_and_wait +function: start: ffffffff end: ffffffff name: unknown_end diff --git a/libbacktrace/testdata/x86_64/libbacktrace_test_eh_frame.so b/libbacktrace/testdata/x86_64/libbacktrace_test_eh_frame.so new file mode 100755 index 0000000000000000000000000000000000000000..f11665830554ef3416d2bd14812f966981c46979 GIT binary patch literal 16752 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