diff options
author | Christopher Ferris <cferris@google.com> | 2019-01-15 15:18:43 -0800 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2019-01-29 17:57:14 -0800 |
commit | 60eb19795bbcdeba162de104af1bcd14478ef230 (patch) | |
tree | 1b80fd0f80e32cda479f538279de6a34c7ed4262 /debuggerd/libdebuggerd/backtrace.cpp | |
parent | 9f5e9978c2b58ebdcc3d253c6e04e31e5b90a0e4 (diff) |
Replace libbacktrace with libunwindstack directly.
Small modifications to the dump_stack method and added unit tests to
verify the output.
Bug: 120606663
Test: Unit tests pass, debuggerd run on processes on target.
Change-Id: Id385a915b751abda3dd6baebed6c3ce498c3bf6e
Diffstat (limited to 'debuggerd/libdebuggerd/backtrace.cpp')
-rw-r--r-- | debuggerd/libdebuggerd/backtrace.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/debuggerd/libdebuggerd/backtrace.cpp b/debuggerd/libdebuggerd/backtrace.cpp index f0a01f41c..753ebcb7c 100644 --- a/debuggerd/libdebuggerd/backtrace.cpp +++ b/debuggerd/libdebuggerd/backtrace.cpp @@ -35,8 +35,8 @@ #include <string> #include <android-base/unique_fd.h> -#include <backtrace/Backtrace.h> #include <log/log.h> +#include <unwindstack/Unwinder.h> #include "libdebuggerd/types.h" #include "libdebuggerd/utility.h" @@ -59,25 +59,27 @@ static void dump_process_footer(log_t* log, pid_t pid) { _LOG(log, logtype::BACKTRACE, "\n----- end %d -----\n", pid); } -void dump_backtrace_thread(int output_fd, BacktraceMap* map, const ThreadInfo& thread) { +void dump_backtrace_thread(int output_fd, unwindstack::Unwinder* unwinder, + const ThreadInfo& thread) { log_t log; log.tfd = output_fd; log.amfd_data = nullptr; _LOG(&log, logtype::BACKTRACE, "\n\"%s\" sysTid=%d\n", thread.thread_name.c_str(), thread.tid); - std::vector<backtrace_frame_data_t> frames; - if (!Backtrace::Unwind(thread.registers.get(), map, &frames, 0, nullptr)) { + unwinder->SetRegs(thread.registers.get()); + unwinder->Unwind(); + if (unwinder->NumFrames() == 0) { _LOG(&log, logtype::THREAD, "Unwind failed: tid = %d", thread.tid); return; } - for (auto& frame : frames) { - _LOG(&log, logtype::BACKTRACE, " %s\n", Backtrace::FormatFrameData(&frame).c_str()); + for (size_t i = 0; i < unwinder->NumFrames(); i++) { + _LOG(&log, logtype::BACKTRACE, " %s\n", unwinder->FormatFrame(i).c_str()); } } -void dump_backtrace(android::base::unique_fd output_fd, BacktraceMap* map, +void dump_backtrace(android::base::unique_fd output_fd, unwindstack::Unwinder* unwinder, const std::map<pid_t, ThreadInfo>& thread_info, pid_t target_thread) { log_t log; log.tfd = output_fd.get(); @@ -91,10 +93,10 @@ void dump_backtrace(android::base::unique_fd output_fd, BacktraceMap* map, dump_process_header(&log, target->second.pid, target->second.process_name.c_str()); - dump_backtrace_thread(output_fd.get(), map, target->second); + dump_backtrace_thread(output_fd.get(), unwinder, target->second); for (const auto& [tid, info] : thread_info) { if (tid != target_thread) { - dump_backtrace_thread(output_fd.get(), map, info); + dump_backtrace_thread(output_fd.get(), unwinder, info); } } |