Merge "Prevent crashes if a map cannot be created."
This commit is contained in:
commit
3f7e06aef5
5 changed files with 26 additions and 2 deletions
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -114,7 +114,9 @@ std::string Backtrace::FormatFrameData(const backtrace_frame_data_t* frame) {
|
|||
}
|
||||
|
||||
void Backtrace::FillInMap(uintptr_t pc, backtrace_map_t* map) {
|
||||
map_->FillIn(pc, map);
|
||||
if (map_ != nullptr) {
|
||||
map_->FillIn(pc, map);
|
||||
}
|
||||
}
|
||||
|
||||
Backtrace* Backtrace::Create(pid_t pid, pid_t tid, BacktraceMap* map) {
|
||||
|
|
|
@ -65,6 +65,11 @@ size_t BacktraceCurrent::Read(uintptr_t addr, uint8_t* buffer, size_t bytes) {
|
|||
}
|
||||
|
||||
bool BacktraceCurrent::Unwind(size_t num_ignore_frames, ucontext_t* ucontext) {
|
||||
if (GetMap() == nullptr) {
|
||||
// Without a map object, we can't do anything.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ucontext) {
|
||||
return UnwindFromContext(num_ignore_frames, ucontext);
|
||||
}
|
||||
|
|
|
@ -48,6 +48,11 @@ UnwindPtrace::~UnwindPtrace() {
|
|||
}
|
||||
|
||||
bool UnwindPtrace::Unwind(size_t num_ignore_frames, ucontext_t* ucontext) {
|
||||
if (GetMap() == nullptr) {
|
||||
// Without a map object, we can't do anything.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ucontext) {
|
||||
BACK_LOGW("Unwinding from a specified context not supported yet.");
|
||||
return false;
|
||||
|
|
Loading…
Reference in a new issue