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 --- .../common/minidump_exception_fuchsia.h | 58 ++++++++++++++++++++ src/google_breakpad/common/minidump_format.h | 4 +- src/processor/exploitability.cc | 1 + src/processor/minidump.cc | 5 ++ src/processor/minidump_processor.cc | 63 +++++++++++++++++++--- 5 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 src/google_breakpad/common/minidump_exception_fuchsia.h diff --git a/src/google_breakpad/common/minidump_exception_fuchsia.h b/src/google_breakpad/common/minidump_exception_fuchsia.h new file mode 100644 index 00000000..f26a8a2a --- /dev/null +++ b/src/google_breakpad/common/minidump_exception_fuchsia.h @@ -0,0 +1,58 @@ +/* Copyright (c) 2019, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_fuchsia.h: A definition of exception codes for Fuchsia. + * + * Author: Ivan Penkov */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_FUCHSIA_H_ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_FUCHSIA_H_ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +// Based on zircon/system/public/zircon/syscalls/exception.h +typedef enum { + // Architectural exceptions + MD_EXCEPTION_CODE_FUCHSIA_GENERAL = 0x8, + MD_EXCEPTION_CODE_FUCHSIA_FATAL_PAGE_FAULT = 0x108, + MD_EXCEPTION_CODE_FUCHSIA_UNDEFINED_INSTRUCTION = 0x208, + MD_EXCEPTION_CODE_FUCHSIA_SW_BREAKPOINT = 0x308, + MD_EXCEPTION_CODE_FUCHSIA_HW_BREAKPOINT = 0x408, + MD_EXCEPTION_CODE_FUCHSIA_UNALIGNED_ACCESS = 0x508, + // + // Synthetic exceptions + MD_EXCEPTION_CODE_FUCHSIA_THREAD_STARTING = 0x8008, + MD_EXCEPTION_CODE_FUCHSIA_THREAD_EXITING = 0x8108, + MD_EXCEPTION_CODE_FUCHSIA_POLICY_ERROR = 0x8208, + MD_EXCEPTION_CODE_FUCHSIA_PROCESS_STARTING = 0x8308, +} MDExceptionCodeFuchsia; + +#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_FUCHSIA_H_ diff --git a/src/google_breakpad/common/minidump_format.h b/src/google_breakpad/common/minidump_format.h index 04c94cd3..6eceddbb 100644 --- a/src/google_breakpad/common/minidump_format.h +++ b/src/google_breakpad/common/minidump_format.h @@ -549,6 +549,7 @@ typedef struct { uint64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS]; } MDException; /* MINIDUMP_EXCEPTION */ +#include "minidump_exception_fuchsia.h" #include "minidump_exception_linux.h" #include "minidump_exception_mac.h" #include "minidump_exception_ps3.h" @@ -678,7 +679,8 @@ typedef enum { MD_OS_SOLARIS = 0x8202, /* Solaris */ MD_OS_ANDROID = 0x8203, /* Android */ MD_OS_PS3 = 0x8204, /* PS3 */ - MD_OS_NACL = 0x8205 /* Native Client (NaCl) */ + MD_OS_NACL = 0x8205, /* Native Client (NaCl) */ + MD_OS_FUCHSIA = 0x8206 /* Fuchsia */ } MDOSPlatform; typedef struct { 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