diff options
Diffstat (limited to 'debuggerd/libdebuggerd/utility.cpp')
-rw-r--r-- | debuggerd/libdebuggerd/utility.cpp | 65 |
1 files changed, 6 insertions, 59 deletions
diff --git a/debuggerd/libdebuggerd/utility.cpp b/debuggerd/libdebuggerd/utility.cpp index ecd98a4c5..2c645b542 100644 --- a/debuggerd/libdebuggerd/utility.cpp +++ b/debuggerd/libdebuggerd/utility.cpp @@ -28,7 +28,6 @@ #include <sys/wait.h> #include <unistd.h> -#include <set> #include <string> #include <android-base/properties.h> @@ -42,7 +41,6 @@ #include <unwindstack/Memory.h> #include <unwindstack/Unwinder.h> -using android::base::StringPrintf; using android::base::unique_fd; bool is_allowed_in_logcat(enum logtype ltype) { @@ -277,10 +275,9 @@ bool signal_has_si_addr(const siginfo_t* si) { case SIGBUS: case SIGFPE: case SIGILL: + case SIGSEGV: case SIGTRAP: return true; - case SIGSEGV: - return si->si_code != SEGV_MTEAERR; default: return false; } @@ -405,8 +402,6 @@ const char* get_sigcode(const siginfo_t* si) { case TRAP_HWBKPT: return "TRAP_HWBKPT"; case TRAP_UNK: return "TRAP_UNDIAGNOSED"; - case TRAP_PERF: - return "TRAP_PERF"; } if ((si->si_code & 0xff) == SIGTRAP) { switch ((si->si_code >> 8) & 0xff) { @@ -428,7 +423,7 @@ const char* get_sigcode(const siginfo_t* si) { return "PTRACE_EVENT_STOP"; } } - static_assert(NSIGTRAP == TRAP_PERF, "missing TRAP_* si_code"); + static_assert(NSIGTRAP == TRAP_UNK, "missing TRAP_* si_code"); break; } // Then the other codes... @@ -447,53 +442,8 @@ const char* get_sigcode(const siginfo_t* si) { return "?"; } -#define DESCRIBE_FLAG(flag) \ - if (value & flag) { \ - desc += ", "; \ - desc += #flag; \ - value &= ~flag; \ - } - -static std::string describe_end(long value, std::string& desc) { - if (value) { - desc += StringPrintf(", unknown 0x%lx", value); - } - return desc.empty() ? "" : " (" + desc.substr(2) + ")"; -} - -std::string describe_tagged_addr_ctrl(long value) { - std::string desc; - DESCRIBE_FLAG(PR_TAGGED_ADDR_ENABLE); - DESCRIBE_FLAG(PR_MTE_TCF_SYNC); - DESCRIBE_FLAG(PR_MTE_TCF_ASYNC); - if (value & PR_MTE_TAG_MASK) { - desc += StringPrintf(", mask 0x%04lx", (value & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT); - value &= ~PR_MTE_TAG_MASK; - } - return describe_end(value, desc); -} - -std::string describe_pac_enabled_keys(long value) { - std::string desc; - DESCRIBE_FLAG(PR_PAC_APIAKEY); - DESCRIBE_FLAG(PR_PAC_APIBKEY); - DESCRIBE_FLAG(PR_PAC_APDAKEY); - DESCRIBE_FLAG(PR_PAC_APDBKEY); - DESCRIBE_FLAG(PR_PAC_APGAKEY); - return describe_end(value, desc); -} - void log_backtrace(log_t* log, unwindstack::Unwinder* unwinder, const char* prefix) { - std::set<std::string> unreadable_elf_files; - unwinder->SetDisplayBuildID(true); - for (const auto& frame : unwinder->frames()) { - if (frame.map_info != nullptr && frame.map_info->ElfFileNotReadable()) { - unreadable_elf_files.emplace(frame.map_info->name()); - } - } - - // Put the preamble ahead of the backtrace. - if (!unreadable_elf_files.empty()) { + if (unwinder->elf_from_memory_not_file()) { _LOG(log, logtype::BACKTRACE, "%sNOTE: Function names and BuildId information is missing for some frames due\n", prefix); _LOG(log, logtype::BACKTRACE, @@ -503,13 +453,10 @@ void log_backtrace(log_t* log, unwindstack::Unwinder* unwinder, const char* pref _LOG(log, logtype::BACKTRACE, "%sNOTE: On this device, run setenforce 0 to make the libraries readable.\n", prefix); #endif - _LOG(log, logtype::BACKTRACE, "%sNOTE: Unreadable libraries:\n", prefix); - for (auto& name : unreadable_elf_files) { - _LOG(log, logtype::BACKTRACE, "%sNOTE: %s\n", prefix, name.c_str()); - } } - for (const auto& frame : unwinder->frames()) { - _LOG(log, logtype::BACKTRACE, "%s%s\n", prefix, unwinder->FormatFrame(frame).c_str()); + unwinder->SetDisplayBuildID(true); + for (size_t i = 0; i < unwinder->NumFrames(); i++) { + _LOG(log, logtype::BACKTRACE, "%s%s\n", prefix, unwinder->FormatFrame(i).c_str()); } } |