diff options
author | Christopher Ferris <cferris@google.com> | 2015-05-14 15:39:52 -0700 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2015-05-15 11:32:53 -0700 |
commit | eb19e766322fb57ccde989e0e35b0ac3e28a4ac2 (patch) | |
tree | 3ccf3f82433f790005edd036bdaa710be90d7702 /debuggerd | |
parent | c89a1774cb483f90f58cb8912e89e58f53dbb6a5 (diff) | |
download | system_core-eb19e766322fb57ccde989e0e35b0ac3e28a4ac2.zip system_core-eb19e766322fb57ccde989e0e35b0ac3e28a4ac2.tar.gz system_core-eb19e766322fb57ccde989e0e35b0ac3e28a4ac2.tar.bz2 |
Prevent crashes if a map cannot be created.
Under some conditions, /proc/<pid>/maps might return nothing. If we
try and unwind in this case, we'll crash. Check this case and fail
the unwind.
Add checks that no other functions try and use map_ without
checking for nullptr.
Add logging when an unwind fails so it's clear what happened.
Bug: 21162746
Change-Id: I56ce51dda0cfc9db20475a441f118108196aa07c
(cherry picked from commit 30c942cf1024bf791c28ab9b67a1f752de72248c)
Diffstat (limited to 'debuggerd')
-rw-r--r-- | debuggerd/backtrace.cpp | 6 | ||||
-rw-r--r-- | debuggerd/tombstone.cpp | 8 |
2 files changed, 13 insertions, 1 deletions
diff --git a/debuggerd/backtrace.cpp b/debuggerd/backtrace.cpp index c2a1dbc..79ee4e5 100644 --- a/debuggerd/backtrace.cpp +++ b/debuggerd/backtrace.cpp @@ -14,6 +14,8 @@ * limitations under the License. */ +#define LOG_TAG "DEBUG" + #include <stddef.h> #include <stdlib.h> #include <string.h> @@ -27,6 +29,8 @@ #include <sys/ptrace.h> #include <backtrace/Backtrace.h> + +#include <log/log.h> #include <UniquePtr.h> #include "backtrace.h" @@ -95,6 +99,8 @@ static void dump_thread( UniquePtr<Backtrace> backtrace(Backtrace::Create(tid, BACKTRACE_CURRENT_THREAD)); if (backtrace->Unwind(0)) { dump_backtrace_to_log(backtrace.get(), log, " "); + } else { + ALOGE("Unwind failed: tid = %d", tid); } if (!attached && ptrace(PTRACE_DETACH, tid, 0, 0) != 0) { diff --git a/debuggerd/tombstone.cpp b/debuggerd/tombstone.cpp index b7e6b17..4c804ee 100644 --- a/debuggerd/tombstone.cpp +++ b/debuggerd/tombstone.cpp @@ -448,6 +448,8 @@ static bool dump_sibling_thread_report( UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, new_tid, map)); if (backtrace->Unwind(0)) { dump_backtrace_and_stack(backtrace.get(), log); + } else { + ALOGE("Unwind of sibling failed: pid = %d, tid = %d", pid, new_tid); } log->current_tid = log->crashed_tid; @@ -650,9 +652,13 @@ static bool dump_crash(log_t* log, pid_t pid, pid_t tid, int signal, int si_code dump_registers(log, tid); if (backtrace->Unwind(0)) { dump_backtrace_and_stack(backtrace.get(), log); + } else { + ALOGE("Unwind failed: pid = %d, tid = %d", pid, tid); } dump_memory_and_code(log, tid); - dump_all_maps(backtrace.get(), map.get(), log, tid); + if (map.get() != nullptr) { + dump_all_maps(backtrace.get(), map.get(), log, tid); + } if (want_logs) { dump_logs(log, pid, 5); |