# Copyright 2013 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. import logging import os LOGGER = logging.getLogger('dmprof') class Dump(object): """Represents a heap profile dump.""" def __init__(self): pass @property def path(self): raise NotImplementedError @property def count(self): raise NotImplementedError @property def time(self): raise NotImplementedError @property def iter_map(self): raise NotImplementedError @property def iter_stacktrace(self): raise NotImplementedError def global_stat(self, name): raise NotImplementedError @property def run_id(self): raise NotImplementedError @property def pagesize(self): raise NotImplementedError @property def pageframe_length(self): raise NotImplementedError @property def pageframe_encoding(self): raise NotImplementedError @property def has_pagecount(self): raise NotImplementedError @staticmethod def load(path, log_header='Loading a heap profile dump: '): """Loads a heap profile dump. Args: path: A file path string to load. log_header: A preceding string for log messages. Returns: A loaded Dump object. Raises: ParsingException for invalid heap profile dumps. """ from lib.deep_dump import DeepDump dump = DeepDump(path, os.stat(path).st_mtime) with open(path, 'r') as f: dump.load_file(f, log_header) return dump class DumpList(object): """Represents a sequence of heap profile dumps. Individual dumps are loaded into memory lazily as the sequence is accessed, either while being iterated through or randomly accessed. Loaded dumps are not cached, meaning a newly loaded Dump object is returned every time an element in the list is accessed. """ def __init__(self, dump_path_list): self._dump_path_list = dump_path_list @staticmethod def load(path_list): return DumpList(path_list) def __len__(self): return len(self._dump_path_list) def __iter__(self): for dump in self._dump_path_list: yield Dump.load(dump) def __getitem__(self, index): return Dump.load(self._dump_path_list[index])