From 4a6d7c70cc5a007bbd8de2f5a2e226b212e3256f Mon Sep 17 00:00:00 2001 From: Ivan Penkov Date: Thu, 11 Jul 2019 18:34:48 -0700 Subject: Improving the support for Fuchsia in Breakpad Processor. Now decoding the OS name and exception codes for Fuchsia. Still not decoding exception flags (can be added later, if needed). Change-Id: If66cb000828be18f0c1b35d1b1f52b3ca3e1fd67 Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/1699049 Reviewed-by: Mark Mentovai --- src/processor/exploitability.cc | 1 + src/processor/minidump.cc | 5 +++ src/processor/minidump_processor.cc | 63 +++++++++++++++++++++++++++++++++---- 3 files changed, 63 insertions(+), 6 deletions(-) (limited to 'src/processor') diff --git a/src/processor/exploitability.cc b/src/processor/exploitability.cc index 6ee1e962..5f05b510 100644 --- a/src/processor/exploitability.cc +++ b/src/processor/exploitability.cc @@ -93,6 +93,7 @@ Exploitability *Exploitability::ExploitabilityForPlatform( case MD_OS_SOLARIS: case MD_OS_ANDROID: case MD_OS_PS3: + case MD_OS_FUCHSIA: default: { platform_exploitability = NULL; break; diff --git a/src/processor/minidump.cc b/src/processor/minidump.cc index aebed0e3..78faf77a 100644 --- a/src/processor/minidump.cc +++ b/src/processor/minidump.cc @@ -2016,6 +2016,7 @@ string MinidumpModule::code_identifier() const { } case MD_OS_ANDROID: + case MD_OS_FUCHSIA: case MD_OS_LINUX: { // If ELF CodeView data is present, return the debug id. if (cv_record_ && cv_record_signature_ == MD_CVINFOELF_SIGNATURE) { @@ -3502,6 +3503,10 @@ string MinidumpSystemInfo::GetOS() { os = "nacl"; break; + case MD_OS_FUCHSIA: + os = "fuchsia"; + break; + default: BPLOG(ERROR) << "MinidumpSystemInfo unknown OS for platform " << HexString(system_info_.platform_id); diff --git a/src/processor/minidump_processor.cc b/src/processor/minidump_processor.cc index e3c3562c..7647124d 100644 --- a/src/processor/minidump_processor.cc +++ b/src/processor/minidump_processor.cc @@ -647,6 +647,11 @@ bool MinidumpProcessor::GetOSInfo(Minidump *dump, SystemInfo *info) { break; } + case MD_OS_FUCHSIA: { + info->os = "Fuchsia"; + break; + } + default: { // Assign the numeric platform ID into the OS string. char os_string[11]; @@ -717,10 +722,12 @@ string MinidumpProcessor::GetCrashReason(Minidump *dump, uint64_t *address) { // map the codes to a string (because there's no system info, or because // it's an unrecognized platform, or because it's an unrecognized code.) char reason_string[24]; + char flags_string[11]; uint32_t exception_code = raw_exception->exception_record.exception_code; uint32_t exception_flags = raw_exception->exception_record.exception_flags; - snprintf(reason_string, sizeof(reason_string), "0x%08x / 0x%08x", - exception_code, exception_flags); + snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags); + snprintf(reason_string, sizeof(reason_string), "0x%08x / %s", exception_code, + flags_string); string reason = reason_string; const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, NULL); @@ -728,10 +735,56 @@ string MinidumpProcessor::GetCrashReason(Minidump *dump, uint64_t *address) { return reason; switch (raw_system_info->platform_id) { + case MD_OS_FUCHSIA: { + switch (exception_code) { + case MD_EXCEPTION_CODE_FUCHSIA_GENERAL: + reason = "GENERAL / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_FATAL_PAGE_FAULT: + reason = "FATAL_PAGE_FAULT / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_UNDEFINED_INSTRUCTION: + reason = "UNDEFINED_INSTRUCTION / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_SW_BREAKPOINT: + reason = "SW_BREAKPOINT / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_HW_BREAKPOINT: + reason = "HW_BREAKPOINT / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_UNALIGNED_ACCESS: + reason = "UNALIGNED_ACCESS / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_THREAD_STARTING: + reason = "THREAD_STARTING / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_THREAD_EXITING: + reason = "THREAD_EXITING / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_POLICY_ERROR: + reason = "POLICY_ERROR / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_PROCESS_STARTING: + reason = "PROCESS_STARTING / "; + reason.append(flags_string); + break; + default: + BPLOG(INFO) << "Unknown exception reason " << reason; + } + break; + } + case MD_OS_MAC_OS_X: case MD_OS_IOS: { - char flags_string[11]; - snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags); switch (exception_code) { case MD_EXCEPTION_MAC_BAD_ACCESS: reason = "EXC_BAD_ACCESS / "; @@ -1239,8 +1292,6 @@ string MinidumpProcessor::GetCrashReason(Minidump *dump, uint64_t *address) { case MD_OS_ANDROID: case MD_OS_LINUX: { - char flags_string[11]; - snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags); switch (exception_code) { case MD_EXCEPTION_CODE_LIN_SIGHUP: reason = "SIGHUP"; -- cgit v1.2.1