Index: src/google_breakpad/processor/minidump.h |
=================================================================== |
--- src/google_breakpad/processor/minidump.h (revision 1474) |
+++ src/google_breakpad/processor/minidump.h (working copy) |
@@ -88,6 +88,7 @@ |
#include <string> |
#include <vector> |
+#include "common/basictypes.h" |
#include "common/using_std_string.h" |
#include "google_breakpad/processor/code_module.h" |
#include "google_breakpad/processor/code_modules.h" |
@@ -94,6 +95,7 @@ |
#include "google_breakpad/processor/dump_context.h" |
#include "google_breakpad/processor/dump_object.h" |
#include "google_breakpad/processor/memory_region.h" |
+#include "google_breakpad/processor/proc_maps_linux.h" |
namespace google_breakpad { |
@@ -808,7 +810,7 @@ |
// These objects are managed by MinidumpMemoryInfoList. |
friend class MinidumpMemoryInfoList; |
- explicit MinidumpMemoryInfo(Minidump* minidump); |
+ explicit MinidumpMemoryInfo(Minidump* minidump_); |
// This works like MinidumpStream::Read, but is driven by |
// MinidumpMemoryInfoList. No size checking is done, because |
@@ -841,7 +843,7 @@ |
static const uint32_t kStreamType = MD_MEMORY_INFO_LIST_STREAM; |
- explicit MinidumpMemoryInfoList(Minidump* minidump); |
+ explicit MinidumpMemoryInfoList(Minidump* minidump_); |
bool Read(uint32_t expected_size); |
@@ -852,7 +854,101 @@ |
uint32_t info_count_; |
}; |
+// MinidumpLinuxMaps wraps information about a single mapped memory region |
+// from /proc/self/maps. |
+class MinidumpLinuxMaps : public MinidumpObject { |
+ public: |
+ // The memory address of the base of the mapped region. |
+ uint64_t GetBase() const { return valid_ ? region_.start : 0; } |
+ // The size of the mapped region. |
+ uint64_t GetSize() const { return valid_ ? region_.end - region_.start : 0; } |
+ // The permissions of the mapped region. |
+ bool IsReadable() const { |
+ return valid_ ? region_.permissions & MappedMemoryRegion::READ : false; |
+ } |
+ bool IsWriteable() const { |
+ return valid_ ? region_.permissions & MappedMemoryRegion::WRITE : false; |
+ } |
+ bool IsExecutable() const { |
+ return valid_ ? region_.permissions & MappedMemoryRegion::EXECUTE : false; |
+ } |
+ bool IsPrivate() const { |
+ return valid_ ? region_.permissions & MappedMemoryRegion::PRIVATE : false; |
+ } |
+ |
+ // The offset of the mapped region. |
+ uint64_t GetOffset() const { return valid_ ? region_.offset : 0; } |
+ |
+ // The major device number. |
+ uint8_t GetMajorDevice() const { return valid_ ? region_.major_device : 0; } |
+ // The minor device number. |
+ uint8_t GetMinorDevice() const { return valid_ ? region_.minor_device : 0; } |
+ |
+ // The inode of the mapped region. |
+ uint64_t GetInode() const { return valid_ ? region_.inode : 0; } |
+ |
+ // The pathname of the mapped region. |
+ const string GetPathname() const { return valid_ ? region_.path : ""; } |
+ |
+ // Print the contents of this mapping. |
+ void Print(); |
+ |
+ private: |
+ // These objects are managed by MinidumpLinuxMapsList. |
+ friend class MinidumpLinuxMapsList; |
+ |
+ // This caller owns the pointer. |
+ explicit MinidumpLinuxMaps(Minidump *minidump); |
+ |
+ // Read data about a single mapping from /proc/self/maps and load the data |
+ // into this object. The input vector is in the same format as a line from |
+ // /proc/self/maps. |
+ |
+ // The memory region struct that this class wraps. |
+ MappedMemoryRegion region_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MinidumpLinuxMaps); |
+}; |
+ |
+// MinidumpLinuxMapsList corresponds to the Linux-exclusive MD_LINUX_MAPS |
+// stream, which contains the contents of /prod/self/maps, which contains |
+// the mapped memory regions and their access permissions. |
+class MinidumpLinuxMapsList : public MinidumpStream { |
+ public: |
+ virtual ~MinidumpLinuxMapsList(); |
+ |
+ // Get mapping at the given memory address. The caller owns the pointer. |
+ const MinidumpLinuxMaps *GetLinuxMapsForAddress(uint64_t address) const; |
+ // Get mapping at the given index. The caller owns the pointer. |
+ const MinidumpLinuxMaps *GetLinuxMapsAtIndex(unsigned int index) const; |
+ |
+ // Print the contents of /proc/self/maps to stdout. |
+ void Print(); |
+ |
+ private: |
+ friend class Minidump; |
+ |
+ typedef vector<MinidumpLinuxMaps *> MinidumpLinuxMappings; |
+ |
+ static const uint32_t kStreamType = MD_LINUX_MAPS; |
+ |
+ // The caller owns the pointer. |
+ explicit MinidumpLinuxMapsList(Minidump *minidump); |
+ |
+ // Read and load the contents of the process mapping data. |
+ // The stream should have data in the form of /proc/self/maps. |
+ // This method returns whether the stream was read successfully. |
+ bool Read(uint32_t expected_size); |
+ |
+ // The list of individual mappings. |
+ MinidumpLinuxMappings *maps_; |
+ // The number of mappings. |
+ uint32_t maps_count_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MinidumpLinuxMapsList); |
+}; |
+ |
// Minidump is the user's interface to a minidump file. It wraps MDRawHeader |
// and provides access to the minidump's top-level stream directory. |
class Minidump { |
@@ -912,6 +1008,9 @@ |
virtual MinidumpBreakpadInfo* GetBreakpadInfo(); |
virtual MinidumpMemoryInfoList* GetMemoryInfoList(); |
+ // The next method also calls GetStream, but is exclusive for Linux dumps. |
+ virtual MinidumpLinuxMapsList *GetLinuxMapsList(); |
+ |
// The next set of methods are provided for users who wish to access |
// data in minidump files directly, while leveraging the rest of |
// this class and related classes to handle the basic minidump |