mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-29 08:39:44 +08:00
bf556829d9
Removes the bitness-specific targets in favour of pulling binaries from the other build directory. This is to avoid the added complexity of duplicating all the targets for the x86 in x64 build. Overall, mostly templatizing more functions to support the wow64-flavoured structures. The only additional functionality required is reading the x86 TEB that's chained from the x64 TEB when running as WOW64. The crashing child test was switched to a manual CreateProcess because it needs to launch a binary other than itself. R=mark@chromium.org BUG=crashpad:50 Review URL: https://codereview.chromium.org/1349313003 .
93 lines
3.0 KiB
C++
93 lines
3.0 KiB
C++
// Copyright 2015 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_WIN_EXCEPTION_SNAPSHOT_WIN_H_
|
|
#define CRASHPAD_SNAPSHOT_WIN_EXCEPTION_SNAPSHOT_WIN_H_
|
|
|
|
#include <stdint.h>
|
|
#include <windows.h>
|
|
|
|
#include "base/basictypes.h"
|
|
#include "build/build_config.h"
|
|
#include "snapshot/cpu_context.h"
|
|
#include "snapshot/exception_snapshot.h"
|
|
#include "util/misc/initialization_state_dcheck.h"
|
|
#include "util/win/address_types.h"
|
|
#include "util/win/process_structs.h"
|
|
|
|
namespace crashpad {
|
|
|
|
class ProcessReaderWin;
|
|
|
|
namespace internal {
|
|
|
|
class ExceptionSnapshotWin final : public ExceptionSnapshot {
|
|
public:
|
|
ExceptionSnapshotWin();
|
|
~ExceptionSnapshotWin() override;
|
|
|
|
//! \brief Initializes the object.
|
|
//!
|
|
//! \param[in] process_reader A ProcessReader for the process that sustained
|
|
//! the exception.
|
|
//! \param[in] thread_id The thread ID in which the exception occurred.
|
|
//! \param[in] exception_pointers_address The address of an
|
|
//! `EXCEPTION_POINTERS` record in the target process, passed through from
|
|
//! the exception handler.
|
|
//!
|
|
//! \return `true` if the snapshot could be created, `false` otherwise with
|
|
//! an appropriate message logged.
|
|
bool Initialize(ProcessReaderWin* process_reader,
|
|
DWORD thread_id,
|
|
WinVMAddress exception_pointers);
|
|
|
|
// 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<uint64_t>& Codes() const override;
|
|
|
|
private:
|
|
template <class ExceptionRecordType,
|
|
class ExceptionPointersType,
|
|
class ContextType>
|
|
bool InitializeFromExceptionPointers(const ProcessReaderWin& process_reader,
|
|
WinVMAddress exception_pointers_address,
|
|
ContextType* context_record);
|
|
|
|
#if defined(ARCH_CPU_X86_FAMILY)
|
|
union {
|
|
CPUContextX86 x86;
|
|
CPUContextX86_64 x86_64;
|
|
} context_union_;
|
|
#endif
|
|
CPUContext context_;
|
|
std::vector<uint64_t> codes_;
|
|
uint64_t thread_id_;
|
|
uint64_t exception_address_;
|
|
uint32_t exception_flags_;
|
|
DWORD exception_code_;
|
|
InitializationStateDcheck initialized_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(ExceptionSnapshotWin);
|
|
};
|
|
|
|
} // namespace internal
|
|
} // namespace crashpad
|
|
|
|
#endif // CRASHPAD_SNAPSHOT_WIN_EXCEPTION_SNAPSHOT_WIN_H_
|