summaryrefslogtreecommitdiffstats
path: root/tools/deep_memory_profiler
diff options
context:
space:
mode:
authordmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-14 03:41:11 +0000
committerdmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-14 03:41:11 +0000
commit4fc91950b9e20a2d58208c7bf5e35c5cea0f008e (patch)
tree0296dd2a0cc10e6c2afa547639be19125f4cd3d8 /tools/deep_memory_profiler
parentbe371a5a5243ae8b4c5e0d53eaa6fb31e1b58571 (diff)
downloadchromium_src-4fc91950b9e20a2d58208c7bf5e35c5cea0f008e.zip
chromium_src-4fc91950b9e20a2d58208c7bf5e35c5cea0f008e.tar.gz
chromium_src-4fc91950b9e20a2d58208c7bf5e35c5cea0f008e.tar.bz2
Fix calling NamedTemporaryFile in dmprof.py and add PRESUBMIT.py for deep_memory_profiler.
BUG=114301 TEST=none Review URL: http://codereview.chromium.org/9694046 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@126547 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/deep_memory_profiler')
-rw-r--r--tools/deep_memory_profiler/PRESUBMIT.py23
-rwxr-xr-xtools/deep_memory_profiler/dmprof.py62
-rw-r--r--tools/deep_memory_profiler/pylintrc267
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=