From 86ea0741846cdab66d1bdfb5a46aaef094f5be3a Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 20 Apr 2018 12:04:41 -0700 Subject: [PATCH] libdebuggerd: clone registers before we Unwind with them. Bug: http://b/77296294 Test: manual inspection of tombstone generated by crasher Change-Id: I4b017701d7d2041db4aefbbb90977e99b844c328 (cherry picked from commit 5d1c14f41bac357c730aa47d705c1f1da7625280) --- debuggerd/libdebuggerd/tombstone.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/debuggerd/libdebuggerd/tombstone.cpp b/debuggerd/libdebuggerd/tombstone.cpp index 140ef6d23..933a5972d 100644 --- a/debuggerd/libdebuggerd/tombstone.cpp +++ b/debuggerd/libdebuggerd/tombstone.cpp @@ -418,8 +418,10 @@ static bool dump_thread(log_t* log, BacktraceMap* map, Memory* process_memory, dump_registers(log, thread_info.registers.get()); + // Unwind will mutate the registers, so make a copy first. + std::unique_ptr regs_copy(thread_info.registers->Clone()); std::vector frames; - if (!Backtrace::Unwind(thread_info.registers.get(), map, &frames, 0, nullptr)) { + if (!Backtrace::Unwind(regs_copy.get(), map, &frames, 0, nullptr)) { _LOG(log, logtype::THREAD, "Failed to unwind"); return false; }