// Copyright 2020 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. #ifndef CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_EXCEPTION_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ #define CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_EXCEPTION_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ #include #include #include #include "base/macros.h" #include "build/build_config.h" #include "snapshot/cpu_context.h" #include "snapshot/exception_snapshot.h" #include "util/ios/ios_intermediate_dump_map.h" #include "util/mach/mach_extensions.h" #include "util/misc/initialization_state_dcheck.h" namespace crashpad { namespace internal { //! \brief An ExceptionSnapshot of an exception sustained by a running (or //! crashed) process on an iOS system. class ExceptionSnapshotIOSIntermediateDump final : public ExceptionSnapshot { public: ExceptionSnapshotIOSIntermediateDump(); ~ExceptionSnapshotIOSIntermediateDump() override; //! \brief Initialize the snapshot as a signal exception. //! //! \param[in] exception_data The intermediate dump map used to initialize //! this object. //! //! \return `true` if the snapshot could be created, `false` otherwise with //! an appropriate message logged. bool InitializeFromSignal(const IOSIntermediateDumpMap* exception_data); //! \brief Initialize the object as a Mach exception from an intermediate //! dump. //! //! \param[in] exception_data The intermediate dump map used to initialize //! this object. //! \param[in] thread_list The intermediate dump map containing list of //! threads. //! //! \return `true` if the snapshot could be created, `false` otherwise with //! an appropriate message logged. bool InitializeFromMachException(const IOSIntermediateDumpMap* exception_data, const IOSIntermediateDumpList* thread_list); //! \brief Initialize the object as an NSException from an intermediate dump. //! //! \param[in] exception_data The intermediate dump map used to initialize //! this object. //! \param[in] thread_list The intermediate dump map containing list of //! threads. //! //! \return `true` if the snapshot could be created, `false` otherwise with //! an appropriate message logged. bool InitializeFromNSException(const IOSIntermediateDumpMap* exception_data, const IOSIntermediateDumpList* thread_list); // ExceptionSnapshot: const CPUContext* Context() const override; uint64_t ThreadID() const override; uint32_t Exception() const override; uint32_t ExceptionInfo() const override; uint64_t ExceptionAddress() const override; const std::vector& Codes() const override; virtual std::vector ExtraMemory() const override; private: void LoadContextFromUncaughtNSExceptionFrames( const IOSIntermediateDumpData* data, const IOSIntermediateDumpMap* other_thread); void LoadContextFromThread(const IOSIntermediateDumpMap* exception_data, const IOSIntermediateDumpMap* other_thread); #if defined(ARCH_CPU_X86_64) CPUContextX86_64 context_x86_64_; #elif defined(ARCH_CPU_ARM64) CPUContextARM64 context_arm64_; #else #error Port. #endif // ARCH_CPU_X86_64 CPUContext context_; std::vector codes_; uint64_t thread_id_; uintptr_t exception_address_; uint32_t exception_; uint32_t exception_info_; InitializationStateDcheck initialized_; DISALLOW_COPY_AND_ASSIGN(ExceptionSnapshotIOSIntermediateDump); }; } // namespace internal } // namespace crashpad #endif // CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_EXCEPTION_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_