1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)# found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)"""This module classifies MemoryMap objects filtering their mmap entries. 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)Two filters are currently available: 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) - 'mmap_file': 'foo.*\.so': matches any entry which mmap file is foo*.so. 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) - 'mmap_prot': 'rw.-': matches any entry which prot. flags is rw*-. 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)""" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import re 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from memory_inspector.classification import results 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from memory_inspector.classification import rules 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from memory_inspector.core import exceptions 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from memory_inspector.core import memory_map 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)_RESULT_KEYS = ['RSS', 'Private Dirty', 'Private Clean', 'Shared Dirty', 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 'Shared Clean'] 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)def LoadRules(content): 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) """Loads and parses a mmap rule tree from a content (string). 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Returns: 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) An instance of |rules.Rule|, which nodes are |_MmapRule| instances. 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) """ 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return rules.Load(content, _MmapRule) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)def Classify(mmap, rule_tree): 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) """Create aggregated results of memory maps using the provided rules. 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Args: 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mmap: the memory map dump being processed (a |memory_map.Map| instance). 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rule_tree: the user-defined rules that define the filtering categories. 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Returns: 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) An instance of |AggreatedResults|. 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) """ 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) assert(isinstance(mmap, memory_map.Map)) 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) assert(isinstance(rule_tree, rules.Rule)) 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) res = results.AggreatedResults(rule_tree, _RESULT_KEYS) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for map_entry in mmap.entries: 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) values = [0, map_entry.priv_dirty_bytes, map_entry.priv_clean_bytes, 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) map_entry.shared_dirty_bytes, map_entry.shared_clean_bytes] 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) values[0] = values[1] + values[2] + values[3] + values[4] 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) res.AddToMatchingNodes(map_entry, values) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return res 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class _MmapRule(rules.Rule): 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) def __init__(self, name, filters): 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) super(_MmapRule, self).__init__(name) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) try: 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self._file_re = ( 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) re.compile(filters['mmap_file']) if 'mmap_file' in filters else None) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self._prot_re = ( 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) re.compile(filters['mmap_prot']) if 'mmap_prot' in filters else None) 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) except re.error, descr: 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) raise exceptions.MemoryInspectorException( 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 'Regex parse error "%s" : %s' % (filters, descr)) 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) def Match(self, map_entry): 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if self._file_re and not self._file_re.search(map_entry.mapped_file): 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return False 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if self._prot_re and not self._prot_re.search(map_entry.prot_flags): 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return False 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return True