Index: tools/memory_inspector/memory_inspector/backends/android/memdump_parser.py |
diff --git a/tools/memory_inspector/memory_inspector/backends/android/memdump_parser.py b/tools/memory_inspector/memory_inspector/backends/android/memdump_parser.py |
deleted file mode 100644 |
index a60ea2503ffdbfa9686b86ee2ff7056746edd511..0000000000000000000000000000000000000000 |
--- a/tools/memory_inspector/memory_inspector/backends/android/memdump_parser.py |
+++ /dev/null |
@@ -1,87 +0,0 @@ |
-# Copyright 2014 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-"""This parser turns the am memdump output into a |memory_map.Map| instance.""" |
- |
-import base64 |
-import logging |
-import re |
- |
-from memory_inspector.core import memory_map |
- |
- |
-def Parse(lines): |
- """Parses the output of memdump. |
- |
- memdump (see chrome/src/tools/memdump) is a Linux/Android binary meant to be |
- executed on the target device which extracts memory map information about one |
- or more processes. In principle is can be seen as an alternative to cat-ing |
- /proc/PID/smaps, but with extra features (multiprocess accounting and resident |
- pages reporting). |
- |
- The expected memdump output looks like this: |
- ------------------------------------------------------------------------------ |
- [ PID=1234] |
- 1000-2000 r-xp 0 private_unevictable=4096 private=8192 shared_app=[] \ |
- shared_other_unevictable=4096 shared_other=4096 "/lib/foo.so" [v///fv0D] |
- ... other entries like the one above. |
- ------------------------------------------------------------------------------ |
- The output is extremely similar to /proc/PID/smaps, with the following notes: |
- - unevictable has pretty much the same meaning of "dirty", in VM terms. |
- - private and shared_other are cumulative. This means the the "clean" part |
- must be calculated as difference of (private - private_unevictable). |
- - The final field [v///fv0D] is a base64 encoded bitmap which contains the |
- information about which pages inside the mapping are resident (present). |
- See tests/android_backend_test.py for a more complete example. |
- |
- Args: |
- lines: array of strings containing memdump output. |
- |
- Returns: |
- An instance of |memory_map.Map|. |
- """ |
- RE = (r'^([0-9a-f]+)-([0-9a-f]+)\s+' |
- r'([rwxps-]{4})\s+' |
- r'([0-9a-f]+)\s+' |
- r'private_unevictable=(\d+) private=(\d+) ' |
- r'shared_app=(.*?) ' |
- r'shared_other_unevictable=(\d+) shared_other=(\d+) ' |
- r'\"(.*)\" ' |
- r'\[([a-zA-Z0-9+/=-_:]*)\]$') |
- map_re = re.compile(RE) |
- skip_first_n_lines = 1 |
- maps = memory_map.Map() |
- |
- for line in lines: |
- line = line.rstrip('\r\n') |
- |
- if skip_first_n_lines > 0: |
- skip_first_n_lines -= 1 |
- continue |
- |
- m = map_re.match(line) |
- if not m: |
- logging.warning('Skipping unrecognized memdump line "%s"' % line) |
- continue |
- |
- start = int(m.group(1), 16) |
- end = int(m.group(2), 16) - 1 # end addr is inclusive in memdump output. |
- if (start > end): |
- # Sadly, this actually happened. Probably a kernel bug, see b/17402069. |
- logging.warning('Skipping unfeasible mmap "%s"' % line) |
- continue |
- entry = memory_map.MapEntry( |
- start=start, |
- end=end, |
- prot_flags=m.group(3), |
- mapped_file=m.group(10), |
- mapped_offset=int(m.group(4), 16)) |
- entry.priv_dirty_bytes = int(m.group(5)) |
- entry.priv_clean_bytes = int(m.group(6)) - entry.priv_dirty_bytes |
- entry.shared_dirty_bytes = int(m.group(8)) |
- entry.shared_clean_bytes = int(m.group(9)) - entry.shared_dirty_bytes |
- entry.resident_pages = [ord(c) for c in base64.b64decode(m.group(11))] |
- maps.Add(entry) |
- |
- return maps |