Index: tools/memory_inspector/memory_inspector/core/memory_map.py |
diff --git a/tools/memory_inspector/memory_inspector/core/memory_map.py b/tools/memory_inspector/memory_inspector/core/memory_map.py |
index f987ab99cb0bb585ebbb662f459d6c4ef0c31010..81ff484b46ae3f3d2ee01bf41eeba85bd3020265 100644 |
--- a/tools/memory_inspector/memory_inspector/core/memory_map.py |
+++ b/tools/memory_inspector/memory_inspector/core/memory_map.py |
@@ -5,13 +5,16 @@ |
import bisect |
+PAGE_SIZE = 4096 |
+ |
+ |
class Map(object): |
"""Models the memory map of a given |backends.Process|. |
This is typically obtained by calling backends.Process.DumpMemoryMaps().""" |
def __init__(self): |
- self.entries = [] |
+ self.entries = [] # List of |MapEntry|, sorted by start address. |
def Add(self, entry): |
assert(isinstance(entry, MapEntry)) |
@@ -39,7 +42,6 @@ class Map(object): |
class MapEntry(object): |
"""An entry (address range + stats) in a memory |Map|.""" |
- PAGE_SIZE = 4096 |
def __init__(self, start, end, prot_flags, mapped_file, mapped_offset, |
priv_dirty_bytes=0, priv_clean_bytes=0, shared_dirty_bytes=0, |
@@ -67,17 +69,19 @@ class MapEntry(object): |
def IsPageResident(self, relative_page_index): |
"""Checks whether a given memory page is resident in memory.""" |
assert(relative_page_index >= 0 and |
- relative_page_index < self.len / MapEntry.PAGE_SIZE) |
- assert(len(self.resident_pages) * MapEntry.PAGE_SIZE * 8 >= self.len) |
+ relative_page_index < self.len / PAGE_SIZE) |
arr_idx = relative_page_index / 8 |
arr_bit = relative_page_index % 8 |
+ # Trailing zeros are trimmed by memdump (to optimize dump time). |
+ if arr_idx >= len(self.resident_pages): |
+ return False |
return (self.resident_pages[arr_idx] & (1 << arr_bit)) != 0 |
def __cmp__(self, other): |
"""Comparison operator required for bisect.""" |
if isinstance(other, MapEntry): |
return self.start - other.start |
- elif isinstance(other, int): |
+ elif isinstance(other, (long, int)): |
return self.start - other |
else: |
raise Exception('Cannot compare with %s' % other.__class__) |
@@ -85,3 +89,8 @@ class MapEntry(object): |
@property |
def len(self): |
return self.end - self.start + 1 |
+ |
+ @property |
+ def rss_bytes(self): |
+ return (self.priv_dirty_bytes + self.priv_clean_bytes + |
+ self.shared_dirty_bytes + self.shared_clean_bytes) |