diff options
-rw-r--r-- | tools/deep_memory_profiler/PRESUBMIT.py | 23 | ||||
-rwxr-xr-x | tools/deep_memory_profiler/dmprof.py | 62 | ||||
-rw-r--r-- | tools/deep_memory_profiler/pylintrc | 267 |
3 files changed, 321 insertions, 31 deletions
diff --git a/tools/deep_memory_profiler/PRESUBMIT.py b/tools/deep_memory_profiler/PRESUBMIT.py new file mode 100644 index 0000000..88595b5 --- /dev/null +++ b/tools/deep_memory_profiler/PRESUBMIT.py @@ -0,0 +1,23 @@ +# Copyright (c) 2012 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. + +"""Top-level presubmit script for deep_memory_profiler. + +See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for +details on the presubmit API built into gcl. +""" + + +def CommonChecks(input_api, output_api): + output = [] + output.extend(input_api.canned_checks.RunPylint(input_api, output_api)) + return output + + +def CheckChangeOnUpload(input_api, output_api): + return CommonChecks(input_api, output_api) + + +def CheckChangeOnCommit(input_api, output_api): + return CommonChecks(input_api, output_api) diff --git a/tools/deep_memory_profiler/dmprof.py b/tools/deep_memory_profiler/dmprof.py index a40e83e..6f433b4 100755 --- a/tools/deep_memory_profiler/dmprof.py +++ b/tools/deep_memory_profiler/dmprof.py @@ -6,7 +6,6 @@ """The deep heap profiler script for Chrome.""" from collections import defaultdict -from datetime import datetime import os import re import subprocess @@ -30,34 +29,29 @@ PPROF_PATH = os.path.join(os.path.dirname(__file__), # Heap Profile Dump versions -"""DUMP_DEEP_1 DOES NOT distinct mmap regions and malloc chunks. -Their stacktraces DO contain mmap* or tc-* at their tops. -They should be processed by POLICY_DEEP_1. -""" +# DUMP_DEEP_1 DOES NOT distinct mmap regions and malloc chunks. +# Their stacktraces DO contain mmap* or tc-* at their tops. +# They should be processed by POLICY_DEEP_1. DUMP_DEEP_1 = 'DUMP_DEEP_1' -"""DUMP_DEEP_2 DOES distinct mmap regions and malloc chunks. -Their stacktraces still DO contain mmap* or tc-*. -They should be processed by POLICY_DEEP_1. -""" +# DUMP_DEEP_2 DOES distinct mmap regions and malloc chunks. +# Their stacktraces still DO contain mmap* or tc-*. +# They should be processed by POLICY_DEEP_1. DUMP_DEEP_2 = 'DUMP_DEEP_2' -"""DUMP_DEEP_3 DOES distinct mmap regions and malloc chunks. -Their stacktraces DO NOT contain mmap* or tc-*. -They should be processed by POLICY_DEEP_2. -""" +# DUMP_DEEP_3 DOES distinct mmap regions and malloc chunks. +# Their stacktraces DO NOT contain mmap* or tc-*. +# They should be processed by POLICY_DEEP_2. DUMP_DEEP_3 = 'DUMP_DEEP_3' # Heap Profile Policy versions -"""POLICY_DEEP_1 DOES NOT include allocation_type columns. -mmap regions are distincted w/ mmap frames in the pattern column. -""" +# POLICY_DEEP_1 DOES NOT include allocation_type columns. +# mmap regions are distincted w/ mmap frames in the pattern column. POLICY_DEEP_1 = 'POLICY_DEEP_1' -"""POLICY_DEEP_2 DOES include allocation_type columns. -mmap regions are distincted w/ the allocation_type column. -""" +# POLICY_DEEP_2 DOES include allocation_type columns. +# mmap regions are distincted w/ the allocation_type column. POLICY_DEEP_2 = 'POLICY_DEEP_2' # TODO(dmikurube): Avoid global variables. @@ -123,7 +117,8 @@ class Log(object): self.log_time = os.stat(self.log_path).st_mtime self.parse_log(buckets) - def dump_stacktrace_lines(self, stacktrace_lines, buckets): + @staticmethod + def dump_stacktrace_lines(stacktrace_lines, buckets): """Prints a given stacktrace. Args: @@ -152,7 +147,8 @@ class Log(object): self.dump_stacktrace_lines(self.mmap_stacktrace_lines, buckets) self.dump_stacktrace_lines(self.malloc_stacktrace_lines, buckets) - def accumulate_size_for_pprof(self, stacktrace_lines, policy_list, buckets, + @staticmethod + def accumulate_size_for_pprof(stacktrace_lines, policy_list, buckets, component_name, mmap): """Accumulates size of committed chunks and the number of allocated chunks. @@ -184,7 +180,8 @@ class Log(object): return com_committed, com_allocs - def dump_stacktrace_lines_for_pprof(self, stacktrace_lines, policy_list, + @staticmethod + def dump_stacktrace_lines_for_pprof(stacktrace_lines, policy_list, buckets, component_name, mmap): """Prints information of stacktrace lines for pprof. @@ -249,7 +246,8 @@ class Log(object): for l in mapping_lines: sys.stdout.write(l) - def check_stacktrace_line(self, stacktrace_line, buckets): + @staticmethod + def check_stacktrace_line(stacktrace_line, buckets): """Checks if a given stacktrace_line is valid as stacktrace. Args: @@ -271,7 +269,8 @@ class Log(object): address_symbol_dict[address] = '' return True - def skip_lines_while(self, line_number, max_line_number, skipping_condition): + @staticmethod + def skip_lines_while(line_number, max_line_number, skipping_condition): """Increments line_number until skipping_condition(line_number) is false. """ while skipping_condition(line_number): @@ -391,7 +390,8 @@ class Log(object): self.parse_global_stats() self.log_version = self.parse_stacktraces(buckets) - def accumulate_size_for_policy(self, stacktrace_lines, + @staticmethod + def accumulate_size_for_policy(stacktrace_lines, policy_list, buckets, sizes, mmap): for l in stacktrace_lines: words = l.split() @@ -470,7 +470,8 @@ class Log(object): return sizes - def accumulate_size_for_expand(self, stacktrace_lines, policy_list, buckets, + @staticmethod + def accumulate_size_for_expand(stacktrace_lines, policy_list, buckets, component_name, depth, sizes, mmap): for line in stacktrace_lines: words = line.split() @@ -526,9 +527,9 @@ def read_symbols(symbol_path, mapping_lines, chrome_path): symbol_lines = symbol_f.readlines() if not symbol_lines: - with NamedTemporaryFile( + with tempfile.NamedTemporaryFile( suffix='maps', prefix="dmprof", mode='w+') as pprof_in: - with NamedTemporaryFile( + with tempfile.NamedTemporaryFile( suffix='symbols', prefix="dmprof", mode='w+') as pprof_out: for line in mapping_lines: pprof_in.write(line) @@ -546,7 +547,6 @@ def read_symbols(symbol_path, mapping_lines, chrome_path): pprof_out.seek(0) symbols = pprof_out.readlines() - i = 0 for address, symbol in zip(address_list, symbols): address_symbol_dict[address] = symbol.strip() @@ -592,8 +592,8 @@ def parse_policy(policy_path): if allocation_type == 'mmap': mmap = True elif policy_version == POLICY_DEEP_1: - name = l.split()[0] - pattern = l[len(name) : len(l)].strip() + name = line.split()[0] + pattern = line[len(name) : len(line)].strip() mmap = False if pattern != 'default': diff --git a/tools/deep_memory_profiler/pylintrc b/tools/deep_memory_profiler/pylintrc new file mode 100644 index 0000000..0ccc2b4 --- /dev/null +++ b/tools/deep_memory_profiler/pylintrc @@ -0,0 +1,267 @@ +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Profiled execution. +profile=no + +# Add <file or directory> to the black list. It should be a base name, not a +# path. You may set this option multiple times. +ignore=CVS + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + + +[MESSAGES CONTROL] + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifier separated by comma (,) or put this option +# multiple time. +# C0103: Invalid name "" +# C0111: Missing docstring +# C0302: Too many lines in module (N) +# I0011: Locally disabling WNNNN +# +# It's a problem but not something we can fix right now. +# R0401: Cyclic import +# +# R0801: Similar lines in N files +# R0901: Too many ancestors (8/7) +# R0902: Too many instance attributes (N/7) +# R0903: Too few public methods (N/2) +# R0904: Too many public methods (N/20) +# R0911: Too many return statements (N/6) +# R0912: Too many branches (N/12) +# R0913: Too many arguments (N/5) +# R0914: Too many local variables (N/15) +# R0915: Too many statements (N/50) +# R0922: Abstract class is only referenced 1 times +# W0122: Use of the exec statement +# W0141: Used builtin function '' +# W0142: Used * or ** magic +# W0402: Uses of a deprecated module 'string' +# W0404: 41: Reimport 'XX' (imported line NN) +# W0511: TODO +# W0603: Using the global statement +# W0613: Unused argument '' +# W0703: Catch "Exception" +# W1201: Specify string format arguments as logging function parameters +disable=C0103,C0111,C0302,I0011,R0401,R0801,R0901,R0902,R0903,R0904,R0911,R0912,R0913,R0914,R0915,R0922,W0122,W0141,W0142,W0402,W0404,W0511,W0603,W0613,W0703,W1201 + + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html +output-format=text + +# Include message's id in output +include-ids=yes + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells whether to display a full report or only the messages +# CHANGE: No report. +reports=no + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (R0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (R0004). +comment=no + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=80 + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +# CHANGE: Use " " instead. +indent-string=' ' + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). +ignored-classes=SQLObject,hashlib + +# When zope mode is activated, add a predefined set of Zope acquired attributes +# to generated-members. +zope=no + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E0201 when accessed. +generated-members=REQUEST,acl_users,aq_parent + + +[BASIC] + +# Required attributes for module, separated by a comma +required-attributes= + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,apply,input + +# Regular expression which should only match correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression which should only match correct module level names +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression which should only match correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression which should only match correct function names +function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct method names +method-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct instance attribute names +attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct list comprehension / +# generator expression variable names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,Run,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Regular expression which should only match functions or classes name which do +# not require a docstring +no-docstring-rgx=__.*__ + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching names used for dummy variables (i.e. not used). +dummy-variables-rgx=_|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + + +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branchs=12 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,string,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report R0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report R0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report R0402 must +# not be disabled) +int-import-graph= |