| Index: snapshot/win/exception_snapshot_win.cc
|
| diff --git a/snapshot/win/exception_snapshot_win.cc b/snapshot/win/exception_snapshot_win.cc
|
| index a32c929487a51548521d9b505b8f32ff27bd7671..1156baf35d4b37852d20521a6ea91fb87d2b30d0 100644
|
| --- a/snapshot/win/exception_snapshot_win.cc
|
| +++ b/snapshot/win/exception_snapshot_win.cc
|
| @@ -69,42 +69,30 @@ bool ExceptionSnapshotWin::Initialize(ProcessReaderWin* process_reader,
|
| return false;
|
| }
|
|
|
| +#if defined(ARCH_CPU_64_BITS)
|
| if (process_reader->Is64Bit()) {
|
| - EXCEPTION_RECORD64 first_record;
|
| - if (!process_reader->ReadMemory(
|
| - reinterpret_cast<WinVMAddress>(exception_pointers.ExceptionRecord),
|
| - sizeof(first_record),
|
| - &first_record)) {
|
| - LOG(ERROR) << "ExceptionRecord";
|
| + CONTEXT context_record;
|
| + if (!InitializeFromExceptionPointers<EXCEPTION_RECORD64>(
|
| + *process_reader, exception_pointers, &context_record)) {
|
| return false;
|
| }
|
| - exception_code_ = first_record.ExceptionCode;
|
| - exception_flags_ = first_record.ExceptionFlags;
|
| - exception_address_ = first_record.ExceptionAddress;
|
| - for (DWORD i = 0; i < first_record.NumberParameters; ++i)
|
| - codes_.push_back(first_record.ExceptionInformation[i]);
|
| - if (first_record.ExceptionRecord) {
|
| - // https://code.google.com/p/crashpad/issues/detail?id=43
|
| - LOG(WARNING) << "dropping chained ExceptionRecord";
|
| - }
|
| -
|
| context_.architecture = kCPUArchitectureX86_64;
|
| context_.x86_64 = &context_union_.x86_64;
|
| - // We assume 64-on-64 here in that we're relying on the CONTEXT definition
|
| - // to be the x64 one.
|
| - CONTEXT context_record;
|
| - if (!process_reader->ReadMemory(
|
| - reinterpret_cast<WinVMAddress>(exception_pointers.ContextRecord),
|
| - sizeof(context_record),
|
| - &context_record)) {
|
| - LOG(ERROR) << "ContextRecord";
|
| - return false;
|
| - }
|
| InitializeX64Context(context_record, context_.x86_64);
|
| } else {
|
| - CHECK(false) << "TODO(scottmg) x86";
|
| + CHECK(false) << "TODO(scottmg) WOW64";
|
| + return false;
|
| + }
|
| +#else
|
| + CONTEXT context_record;
|
| + if (!InitializeFromExceptionPointers<EXCEPTION_RECORD32>(
|
| + *process_reader, exception_pointers, &context_record)) {
|
| return false;
|
| }
|
| + context_.architecture = kCPUArchitectureX86;
|
| + context_.x86 = &context_union_.x86;
|
| + InitializeX86Context(context_record, context_.x86);
|
| +#endif // ARCH_CPU_64_BITS
|
|
|
| INITIALIZATION_STATE_SET_VALID(initialized_);
|
| return true;
|
| @@ -140,5 +128,39 @@ const std::vector<uint64_t>& ExceptionSnapshotWin::Codes() const {
|
| return codes_;
|
| }
|
|
|
| +template <class ExceptionRecordType, class ContextType>
|
| +bool ExceptionSnapshotWin::InitializeFromExceptionPointers(
|
| + const ProcessReaderWin& process_reader,
|
| + const EXCEPTION_POINTERS& exception_pointers,
|
| + ContextType* context_record) {
|
| + ExceptionRecordType first_record;
|
| + if (!process_reader.ReadMemory(
|
| + reinterpret_cast<WinVMAddress>(exception_pointers.ExceptionRecord),
|
| + sizeof(first_record),
|
| + &first_record)) {
|
| + LOG(ERROR) << "ExceptionRecord";
|
| + return false;
|
| + }
|
| + exception_code_ = first_record.ExceptionCode;
|
| + exception_flags_ = first_record.ExceptionFlags;
|
| + exception_address_ = first_record.ExceptionAddress;
|
| + for (DWORD i = 0; i < first_record.NumberParameters; ++i)
|
| + codes_.push_back(first_record.ExceptionInformation[i]);
|
| + if (first_record.ExceptionRecord) {
|
| + // https://code.google.com/p/crashpad/issues/detail?id=43
|
| + LOG(WARNING) << "dropping chained ExceptionRecord";
|
| + }
|
| +
|
| + if (!process_reader.ReadMemory(
|
| + reinterpret_cast<WinVMAddress>(exception_pointers.ContextRecord),
|
| + sizeof(*context_record),
|
| + context_record)) {
|
| + LOG(ERROR) << "ContextRecord";
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| } // namespace internal
|
| } // namespace crashpad
|
|
|