Index: snapshot/exception_snapshot_mac.cc |
diff --git a/snapshot/exception_snapshot_mac.cc b/snapshot/exception_snapshot_mac.cc |
deleted file mode 100644 |
index 2a67ea95dd676cac68f8aaaa7983eeec55636493..0000000000000000000000000000000000000000 |
--- a/snapshot/exception_snapshot_mac.cc |
+++ /dev/null |
@@ -1,175 +0,0 @@ |
-// Copyright 2014 The Crashpad Authors. All rights reserved. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
- |
-#include "snapshot/exception_snapshot_mac.h" |
- |
-#include "base/logging.h" |
-#include "base/strings/stringprintf.h" |
-#include "snapshot/cpu_context_mac.h" |
-#include "util/mac/process_reader.h" |
-#include "util/mach/exc_server_variants.h" |
-#include "util/numeric/safe_assignment.h" |
- |
-namespace crashpad { |
-namespace internal { |
- |
-ExceptionSnapshotMac::ExceptionSnapshotMac() |
- : ExceptionSnapshot(), |
- context_union_(), |
- context_(), |
- codes_(), |
- thread_id_(0), |
- exception_address_(0), |
- exception_(0), |
- exception_code_0_(0), |
- initialized_() { |
-} |
- |
-ExceptionSnapshotMac::~ExceptionSnapshotMac() { |
-} |
- |
-bool ExceptionSnapshotMac::Initialize(ProcessReader* process_reader, |
- thread_t exception_thread, |
- exception_type_t exception, |
- const mach_exception_data_type_t* code, |
- mach_msg_type_number_t code_count, |
- thread_state_flavor_t flavor, |
- const natural_t* state, |
- mach_msg_type_number_t state_count) { |
- INITIALIZATION_STATE_SET_INITIALIZING(initialized_); |
- |
- codes_.push_back(exception); |
- for (mach_msg_type_number_t code_index = 0; |
- code_index < code_count; |
- ++code_index) { |
- codes_.push_back(code[code_index]); |
- } |
- |
- exception_ = exception; |
- mach_exception_code_t exception_code_0 = code[0]; |
- |
- if (exception_ == EXC_CRASH) { |
- exception_ = ExcCrashRecoverOriginalException( |
- exception_code_0, &exception_code_0, nullptr); |
- } |
- |
- // ExceptionInfo() returns code[0] in a 32-bit field. This shouldn’t be a |
- // problem because code[0]’s values never exceed 32 bits. Only code[1] is ever |
- // expected to be that wide. |
- if (!AssignIfInRange(&exception_code_0_, exception_code_0)) { |
- LOG(WARNING) |
- << base::StringPrintf("exception_code_0 0x%llx out of range", |
- exception_code_0); |
- return false; |
- } |
- |
- const ProcessReader::Thread* thread = nullptr; |
- for (const ProcessReader::Thread& loop_thread : process_reader->Threads()) { |
- if (exception_thread == loop_thread.port) { |
- thread = &loop_thread; |
- break; |
- } |
- } |
- |
- if (!thread) { |
- LOG(WARNING) << "exception_thread not found in task"; |
- return false; |
- } |
- |
- thread_id_ = thread->id; |
- |
- // Normally, the exception address is present in code[1] for EXC_BAD_ACCESS |
- // exceptions, but not for other types of exceptions. |
- bool code_1_is_exception_address = exception_ == EXC_BAD_ACCESS; |
- |
-#if defined(ARCH_CPU_X86_FAMILY) |
- if (process_reader->Is64Bit()) { |
- context_.architecture = kCPUArchitectureX86_64; |
- context_.x86_64 = &context_union_.x86_64; |
- InitializeCPUContextX86_64(context_.x86_64, |
- flavor, |
- state, |
- state_count, |
- &thread->thread_context.t64, |
- &thread->float_context.f64, |
- &thread->debug_context.d64); |
- } else { |
- context_.architecture = kCPUArchitectureX86; |
- context_.x86 = &context_union_.x86; |
- InitializeCPUContextX86(context_.x86, |
- flavor, |
- state, |
- state_count, |
- &thread->thread_context.t32, |
- &thread->float_context.f32, |
- &thread->debug_context.d32); |
- } |
- |
- // For x86 and x86_64 EXC_BAD_ACCESS exceptions, some code[0] values indicate |
- // that code[1] does not (or may not) carry the exception address: |
- // EXC_I386_GPFLT (10.9.5 xnu-2422.115.4/osfmk/i386/trap.c user_trap() for |
- // T_GENERAL_PROTECTION) and the oddball (VM_PROT_READ | VM_PROT_EXECUTE) |
- // which collides with EXC_I386_BOUNDFLT (10.9.5 |
- // xnu-2422.115.4/osfmk/i386/fpu.c fpextovrflt()). Other EXC_BAD_ACCESS |
- // exceptions come through 10.9.5 xnu-2422.115.4/osfmk/i386/trap.c |
- // user_page_fault_continue() and do contain the exception address in code[1]. |
- if (exception_ == EXC_BAD_ACCESS && |
- (exception_code_0_ == EXC_I386_GPFLT || |
- exception_code_0_ == (VM_PROT_READ | VM_PROT_EXECUTE))) { |
- code_1_is_exception_address = false; |
- } |
-#endif |
- |
- if (code_1_is_exception_address) { |
- exception_address_ = code[1]; |
- } else { |
- exception_address_ = context_.InstructionPointer(); |
- } |
- |
- INITIALIZATION_STATE_SET_VALID(initialized_); |
- return true; |
-} |
- |
-const CPUContext* ExceptionSnapshotMac::Context() const { |
- INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
- return &context_; |
-} |
- |
-uint64_t ExceptionSnapshotMac::ThreadID() const { |
- INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
- return thread_id_; |
-} |
- |
-uint32_t ExceptionSnapshotMac::Exception() const { |
- INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
- return exception_; |
-} |
- |
-uint32_t ExceptionSnapshotMac::ExceptionInfo() const { |
- INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
- return exception_code_0_; |
-} |
- |
-uint64_t ExceptionSnapshotMac::ExceptionAddress() const { |
- INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
- return exception_address_; |
-} |
- |
-const std::vector<uint64_t>& ExceptionSnapshotMac::Codes() const { |
- INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
- return codes_; |
-} |
- |
-} // namespace internal |
-} // namespace crashpad |