From 6b451ea32a2eb45a7a5a773300044031f0d22a24 Mon Sep 17 00:00:00 2001 From: Mark Mentovai Date: Fri, 3 Oct 2014 14:57:07 -0400 Subject: [PATCH] Add MemorySnapshotMac. R=rsesek@chromium.org Review URL: https://codereview.chromium.org/623163004 --- snapshot/memory_snapshot_mac.cc | 63 ++++++++++++++++++++++++++++++ snapshot/memory_snapshot_mac.h | 68 +++++++++++++++++++++++++++++++++ snapshot/snapshot.gyp | 2 + 3 files changed, 133 insertions(+) create mode 100644 snapshot/memory_snapshot_mac.cc create mode 100644 snapshot/memory_snapshot_mac.h diff --git a/snapshot/memory_snapshot_mac.cc b/snapshot/memory_snapshot_mac.cc new file mode 100644 index 00000000..163c3820 --- /dev/null +++ b/snapshot/memory_snapshot_mac.cc @@ -0,0 +1,63 @@ +// 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/memory_snapshot_mac.h" + +#include "util/mach/task_memory.h" + +namespace crashpad { +namespace internal { + +MemorySnapshotMac::MemorySnapshotMac() + : MemorySnapshot(), + process_reader_(NULL), + address_(0), + size_(0), + initialized_() { +} + +MemorySnapshotMac::~MemorySnapshotMac() { +} + +void MemorySnapshotMac::Initialize(ProcessReader* process_reader, + uint64_t address, + uint64_t size) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + process_reader_ = process_reader; + address_ = address; + size_ = size; + INITIALIZATION_STATE_SET_VALID(initialized_); +} + +uint64_t MemorySnapshotMac::Address() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return address_; +} + +size_t MemorySnapshotMac::Size() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return size_; +} + +bool MemorySnapshotMac::Read(Delegate* delegate) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + scoped_ptr buffer(new uint8_t[size_]); + if (!process_reader_->Memory()->Read(address_, size_, buffer.get())) { + return false; + } + return delegate->MemorySnapshotDelegateRead(buffer.get(), size_); +} + +} // namespace internal +} // namespace crashpad diff --git a/snapshot/memory_snapshot_mac.h b/snapshot/memory_snapshot_mac.h new file mode 100644 index 00000000..4964a777 --- /dev/null +++ b/snapshot/memory_snapshot_mac.h @@ -0,0 +1,68 @@ +// 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. + +#ifndef CRASHPAD_SNAPSHOT_MEMORY_SNAPSHOT_MAC_H_ +#define CRASHPAD_SNAPSHOT_MEMORY_SNAPSHOT_MAC_H_ + +#include +#include + +#include "base/basictypes.h" +#include "snapshot/memory_snapshot.h" +#include "util/mac/process_reader.h" +#include "util/misc/initialization_state_dcheck.h" + +namespace crashpad { +namespace internal { + +//! \brief A MemorySnapshot of a memory region in a process on the running +//! system, when the system runs Mac OS X. +class MemorySnapshotMac final : public MemorySnapshot { + public: + MemorySnapshotMac(); + ~MemorySnapshotMac(); + + //! \brief Initializes the object. + //! + //! Memory is read lazily. No attempt is made to read the memory snapshot data + //! until Read() is called, and the memory snapshot data is discared when + //! Read() returns. + //! + //! \param[in] process_reader A reader for the process being snapshotted. + //! \param[in] address The base address of the memory region to snapshot, in + //! the snapshot process’ address space. + //! \param[in] size The size of the memory region to snapshot. + void Initialize(ProcessReader* process_reader, + uint64_t address, + uint64_t size); + + // MemorySnapshot: + + virtual uint64_t Address() const override; + virtual size_t Size() const override; + virtual bool Read(Delegate* delegate) const override; + + private: + ProcessReader* process_reader_; // weak + uint64_t address_; + uint64_t size_; + InitializationStateDcheck initialized_; + + DISALLOW_COPY_AND_ASSIGN(MemorySnapshotMac); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_SNAPSHOT_MEMORY_SNAPSHOT_MAC_H_ diff --git a/snapshot/snapshot.gyp b/snapshot/snapshot.gyp index 19bf6834..eb8b2203 100644 --- a/snapshot/snapshot.gyp +++ b/snapshot/snapshot.gyp @@ -31,6 +31,8 @@ 'cpu_context.h', 'exception_snapshot.h', 'memory_snapshot.h', + 'memory_snapshot_mac.cc', + 'memory_snapshot_mac.h', 'module_snapshot.h', 'process_snapshot.h', 'system_snapshot.h',