Loading debuggerd/tombstone.cpp +39 −43 Original line number Original line Diff line number Diff line Loading @@ -242,11 +242,9 @@ static void dump_stack_segment( backtrace_map_t map; backtrace_map_t map; backtrace->FillInMap(stack_content, &map); backtrace->FillInMap(stack_content, &map); const char* map_name; std::string map_name; if (BacktraceMap::IsValid(map)) { if (BacktraceMap::IsValid(map) && map.name.length() > 0) { map_name = ""; map_name = " " + map.name; } else { map_name = map.name.c_str(); } } uintptr_t offset = 0; uintptr_t offset = 0; std::string func_name(backtrace->GetFunctionName(stack_content, &offset)); std::string func_name(backtrace->GetFunctionName(stack_content, &offset)); Loading @@ -254,27 +252,27 @@ static void dump_stack_segment( if (!i && label >= 0) { if (!i && label >= 0) { if (offset) { if (offset) { _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s (%s+%" PRIuPTR ")\n", _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s (%s+%" PRIuPTR ")\n", label, *sp, stack_content, map_name, func_name.c_str(), offset); label, *sp, stack_content, map_name.c_str(), func_name.c_str(), offset); } else { } else { _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s (%s)\n", _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s (%s)\n", label, *sp, stack_content, map_name, func_name.c_str()); label, *sp, stack_content, map_name.c_str(), func_name.c_str()); } } } else { } else { if (offset) { if (offset) { _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s (%s+%" PRIuPTR ")\n", _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s (%s+%" PRIuPTR ")\n", *sp, stack_content, map_name, func_name.c_str(), offset); *sp, stack_content, map_name.c_str(), func_name.c_str(), offset); } else { } else { _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s (%s)\n", _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s (%s)\n", *sp, stack_content, map_name, func_name.c_str()); *sp, stack_content, map_name.c_str(), func_name.c_str()); } } } } } else { } else { if (!i && label >= 0) { if (!i && label >= 0) { _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s\n", _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s\n", label, *sp, stack_content, map_name); label, *sp, stack_content, map_name.c_str()); } else { } else { _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s\n", _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s\n", *sp, stack_content, map_name); *sp, stack_content, map_name.c_str()); } } } } Loading Loading @@ -327,35 +325,27 @@ static void dump_stack(Backtrace* backtrace, log_t* log) { } } } } static void dump_backtrace_and_stack(Backtrace* backtrace, log_t* log) { if (backtrace->NumFrames()) { _LOG(log, logtype::BACKTRACE, "\nbacktrace:\n"); dump_backtrace_to_log(backtrace, log, " "); _LOG(log, logtype::STACK, "\nstack:\n"); dump_stack(backtrace, log); } } static void dump_map(log_t* log, const backtrace_map_t* map, bool fault_addr) { static void dump_map(log_t* log, const backtrace_map_t* map, bool fault_addr) { _LOG(log, logtype::MAPS, "%s%" PRIPTR "-%" PRIPTR " %c%c%c %7" PRIdPTR "%s\n", _LOG(log, logtype::MAPS, "%s%" PRIPTR "-%" PRIPTR " %c%c%c %7" PRIdPTR "%s\n", (fault_addr? "--->" : " "), map->start, map->end - 1, (fault_addr? "--->" : " "), map->start, map->end - 1, (map->flags & PROT_READ) ? 'r' : '-', (map->flags & PROT_WRITE) ? 'w' : '-', (map->flags & PROT_READ) ? 'r' : '-', (map->flags & PROT_WRITE) ? 'w' : '-', (map->flags & PROT_EXEC) ? 'x' : '-', (map->flags & PROT_EXEC) ? 'x' : '-', (map->end - map->start), map->name.c_str()); (map->end - map->start), (map->name.length() > 0) ? (" " + map->name).c_str() : ""); } } static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) { static void dump_all_maps(BacktraceMap* map, log_t* log, pid_t tid) { bool has_fault_address = false; uintptr_t addr = 0; siginfo_t si; siginfo_t si; memset(&si, 0, sizeof(si)); memset(&si, 0, sizeof(si)); if (ptrace(PTRACE_GETSIGINFO, tid, 0, &si)) { if (ptrace(PTRACE_GETSIGINFO, tid, 0, &si)) { _LOG(log, logtype::MAPS, "cannot get siginfo for %d: %s\n", tid, strerror(errno)); _LOG(log, logtype::MAPS, "cannot get siginfo for %d: %s\n", tid, strerror(errno)); return; } else { has_fault_address = signal_has_si_addr(si.si_signo); addr = reinterpret_cast<uintptr_t>(si.si_addr); } } bool has_fault_address = signal_has_si_addr(si.si_signo); uintptr_t addr = reinterpret_cast<uintptr_t>(si.si_addr); _LOG(log, logtype::MAPS, "\nmemory map:%s\n", has_fault_address ? " (fault address prefixed with --->)" : ""); _LOG(log, logtype::MAPS, "\nmemory map:%s\n", has_fault_address ? " (fault address prefixed with --->)" : ""); if (has_fault_address && (addr < map->begin()->start)) { if (has_fault_address && (addr < map->begin()->start)) { Loading @@ -376,12 +366,14 @@ static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) { } } } } static void dump_thread(Backtrace* backtrace, log_t* log) { static void dump_backtrace_and_stack(Backtrace* backtrace, log_t* log) { dump_registers(log, backtrace->Tid()); if (backtrace->NumFrames()) { dump_backtrace_and_stack(backtrace, log); _LOG(log, logtype::BACKTRACE, "\nbacktrace:\n"); dump_backtrace_to_log(backtrace, log, " "); dump_memory_and_code(log, backtrace->Tid()); _LOG(log, logtype::STACK, "\nstack:\n"); dump_nearby_maps(backtrace->GetMap(), log, backtrace->Tid()); dump_stack(backtrace, log); } } } // Return true if some thread is not detached cleanly // Return true if some thread is not detached cleanly Loading Loading @@ -427,9 +419,10 @@ static bool dump_sibling_thread_report( _LOG(log, logtype::THREAD, "--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n"); _LOG(log, logtype::THREAD, "--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n"); dump_thread_info(log, pid, new_tid); dump_thread_info(log, pid, new_tid); dump_registers(log, new_tid); UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, new_tid, map)); UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, new_tid, map)); if (backtrace->Unwind(0)) { if (backtrace->Unwind(0)) { dump_thread(backtrace.get(), log); dump_backtrace_and_stack(backtrace.get(), log); } } log->current_tid = log->crashed_tid; log->current_tid = log->crashed_tid; Loading Loading @@ -628,10 +621,13 @@ static bool dump_crash(log_t* log, pid_t pid, pid_t tid, int signal, int si_code UniquePtr<BacktraceMap> map(BacktraceMap::Create(pid)); UniquePtr<BacktraceMap> map(BacktraceMap::Create(pid)); UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, tid, map.get())); UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, tid, map.get())); if (backtrace->Unwind(0)) { dump_abort_message(backtrace.get(), log, abort_msg_address); dump_abort_message(backtrace.get(), log, abort_msg_address); dump_thread(backtrace.get(), log); dump_registers(log, tid); if (backtrace->Unwind(0)) { dump_backtrace_and_stack(backtrace.get(), log); } } dump_memory_and_code(log, tid); dump_all_maps(map.get(), log, tid); if (want_logs) { if (want_logs) { dump_logs(log, pid, 5); dump_logs(log, pid, 5); Loading Loading
debuggerd/tombstone.cpp +39 −43 Original line number Original line Diff line number Diff line Loading @@ -242,11 +242,9 @@ static void dump_stack_segment( backtrace_map_t map; backtrace_map_t map; backtrace->FillInMap(stack_content, &map); backtrace->FillInMap(stack_content, &map); const char* map_name; std::string map_name; if (BacktraceMap::IsValid(map)) { if (BacktraceMap::IsValid(map) && map.name.length() > 0) { map_name = ""; map_name = " " + map.name; } else { map_name = map.name.c_str(); } } uintptr_t offset = 0; uintptr_t offset = 0; std::string func_name(backtrace->GetFunctionName(stack_content, &offset)); std::string func_name(backtrace->GetFunctionName(stack_content, &offset)); Loading @@ -254,27 +252,27 @@ static void dump_stack_segment( if (!i && label >= 0) { if (!i && label >= 0) { if (offset) { if (offset) { _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s (%s+%" PRIuPTR ")\n", _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s (%s+%" PRIuPTR ")\n", label, *sp, stack_content, map_name, func_name.c_str(), offset); label, *sp, stack_content, map_name.c_str(), func_name.c_str(), offset); } else { } else { _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s (%s)\n", _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s (%s)\n", label, *sp, stack_content, map_name, func_name.c_str()); label, *sp, stack_content, map_name.c_str(), func_name.c_str()); } } } else { } else { if (offset) { if (offset) { _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s (%s+%" PRIuPTR ")\n", _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s (%s+%" PRIuPTR ")\n", *sp, stack_content, map_name, func_name.c_str(), offset); *sp, stack_content, map_name.c_str(), func_name.c_str(), offset); } else { } else { _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s (%s)\n", _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s (%s)\n", *sp, stack_content, map_name, func_name.c_str()); *sp, stack_content, map_name.c_str(), func_name.c_str()); } } } } } else { } else { if (!i && label >= 0) { if (!i && label >= 0) { _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s\n", _LOG(log, logtype::STACK, " #%02d %" PRIPTR " %" PRIPTR "%s\n", label, *sp, stack_content, map_name); label, *sp, stack_content, map_name.c_str()); } else { } else { _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s\n", _LOG(log, logtype::STACK, " %" PRIPTR " %" PRIPTR "%s\n", *sp, stack_content, map_name); *sp, stack_content, map_name.c_str()); } } } } Loading Loading @@ -327,35 +325,27 @@ static void dump_stack(Backtrace* backtrace, log_t* log) { } } } } static void dump_backtrace_and_stack(Backtrace* backtrace, log_t* log) { if (backtrace->NumFrames()) { _LOG(log, logtype::BACKTRACE, "\nbacktrace:\n"); dump_backtrace_to_log(backtrace, log, " "); _LOG(log, logtype::STACK, "\nstack:\n"); dump_stack(backtrace, log); } } static void dump_map(log_t* log, const backtrace_map_t* map, bool fault_addr) { static void dump_map(log_t* log, const backtrace_map_t* map, bool fault_addr) { _LOG(log, logtype::MAPS, "%s%" PRIPTR "-%" PRIPTR " %c%c%c %7" PRIdPTR "%s\n", _LOG(log, logtype::MAPS, "%s%" PRIPTR "-%" PRIPTR " %c%c%c %7" PRIdPTR "%s\n", (fault_addr? "--->" : " "), map->start, map->end - 1, (fault_addr? "--->" : " "), map->start, map->end - 1, (map->flags & PROT_READ) ? 'r' : '-', (map->flags & PROT_WRITE) ? 'w' : '-', (map->flags & PROT_READ) ? 'r' : '-', (map->flags & PROT_WRITE) ? 'w' : '-', (map->flags & PROT_EXEC) ? 'x' : '-', (map->flags & PROT_EXEC) ? 'x' : '-', (map->end - map->start), map->name.c_str()); (map->end - map->start), (map->name.length() > 0) ? (" " + map->name).c_str() : ""); } } static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) { static void dump_all_maps(BacktraceMap* map, log_t* log, pid_t tid) { bool has_fault_address = false; uintptr_t addr = 0; siginfo_t si; siginfo_t si; memset(&si, 0, sizeof(si)); memset(&si, 0, sizeof(si)); if (ptrace(PTRACE_GETSIGINFO, tid, 0, &si)) { if (ptrace(PTRACE_GETSIGINFO, tid, 0, &si)) { _LOG(log, logtype::MAPS, "cannot get siginfo for %d: %s\n", tid, strerror(errno)); _LOG(log, logtype::MAPS, "cannot get siginfo for %d: %s\n", tid, strerror(errno)); return; } else { has_fault_address = signal_has_si_addr(si.si_signo); addr = reinterpret_cast<uintptr_t>(si.si_addr); } } bool has_fault_address = signal_has_si_addr(si.si_signo); uintptr_t addr = reinterpret_cast<uintptr_t>(si.si_addr); _LOG(log, logtype::MAPS, "\nmemory map:%s\n", has_fault_address ? " (fault address prefixed with --->)" : ""); _LOG(log, logtype::MAPS, "\nmemory map:%s\n", has_fault_address ? " (fault address prefixed with --->)" : ""); if (has_fault_address && (addr < map->begin()->start)) { if (has_fault_address && (addr < map->begin()->start)) { Loading @@ -376,12 +366,14 @@ static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) { } } } } static void dump_thread(Backtrace* backtrace, log_t* log) { static void dump_backtrace_and_stack(Backtrace* backtrace, log_t* log) { dump_registers(log, backtrace->Tid()); if (backtrace->NumFrames()) { dump_backtrace_and_stack(backtrace, log); _LOG(log, logtype::BACKTRACE, "\nbacktrace:\n"); dump_backtrace_to_log(backtrace, log, " "); dump_memory_and_code(log, backtrace->Tid()); _LOG(log, logtype::STACK, "\nstack:\n"); dump_nearby_maps(backtrace->GetMap(), log, backtrace->Tid()); dump_stack(backtrace, log); } } } // Return true if some thread is not detached cleanly // Return true if some thread is not detached cleanly Loading Loading @@ -427,9 +419,10 @@ static bool dump_sibling_thread_report( _LOG(log, logtype::THREAD, "--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n"); _LOG(log, logtype::THREAD, "--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n"); dump_thread_info(log, pid, new_tid); dump_thread_info(log, pid, new_tid); dump_registers(log, new_tid); UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, new_tid, map)); UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, new_tid, map)); if (backtrace->Unwind(0)) { if (backtrace->Unwind(0)) { dump_thread(backtrace.get(), log); dump_backtrace_and_stack(backtrace.get(), log); } } log->current_tid = log->crashed_tid; log->current_tid = log->crashed_tid; Loading Loading @@ -628,10 +621,13 @@ static bool dump_crash(log_t* log, pid_t pid, pid_t tid, int signal, int si_code UniquePtr<BacktraceMap> map(BacktraceMap::Create(pid)); UniquePtr<BacktraceMap> map(BacktraceMap::Create(pid)); UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, tid, map.get())); UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, tid, map.get())); if (backtrace->Unwind(0)) { dump_abort_message(backtrace.get(), log, abort_msg_address); dump_abort_message(backtrace.get(), log, abort_msg_address); dump_thread(backtrace.get(), log); dump_registers(log, tid); if (backtrace->Unwind(0)) { dump_backtrace_and_stack(backtrace.get(), log); } } dump_memory_and_code(log, tid); dump_all_maps(map.get(), log, tid); if (want_logs) { if (want_logs) { dump_logs(log, pid, 5); dump_logs(log, pid, 5); Loading