Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(34)

Unified Diff: tools/deep_memory_profiler/dmprof

Issue 10795043: Use find_runtime_symbols in dmprof. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: reflected the comment Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/deep_memory_profiler/download.sh » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/deep_memory_profiler/dmprof
diff --git a/tools/deep_memory_profiler/dmprof b/tools/deep_memory_profiler/dmprof
index 358427759533382280b730235bfd39d47e962c02..8a6f93b99738c1e3329d2357f554cbbd680fbab0 100755
--- a/tools/deep_memory_profiler/dmprof
+++ b/tools/deep_memory_profiler/dmprof
@@ -9,10 +9,20 @@ from datetime import datetime
import json
import os
import re
+import shutil
import subprocess
import sys
import tempfile
+FIND_RUNTIME_SYMBOLS_PATH = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)),
+ os.pardir,
+ 'find_runtime_symbols')
+sys.path.append(FIND_RUNTIME_SYMBOLS_PATH)
+
+from prepare_symbol_info import prepare_symbol_info
+from find_runtime_symbols import find_runtime_symbols_list
+
BUCKET_ID = 5
VIRTUAL = 0
COMMITTED = 1
@@ -20,23 +30,6 @@ ALLOC_COUNT = 2
FREE_COUNT = 3
NULL_REGEX = re.compile('')
-# If an executable pprof script is in the directory of deep_memory_profiler,
-# use it. Otherwise, use tcmalloc's pprof.
-#
-# A pprof script in deep_memory_profiler/ is prioritized to allow packaging
-# deep_memory_profiler files with a pprof script. The packaged
-# deep_memory_profiler is downloaded with pprof by using download.sh.
-PPROF_PATH = os.path.join(os.path.dirname(__file__), 'pprof')
-if not (os.path.isfile(PPROF_PATH) and os.access(PPROF_PATH, os.X_OK)):
- PPROF_PATH = os.path.join(os.path.dirname(__file__),
- os.pardir,
- os.pardir,
- 'third_party',
- 'tcmalloc',
- 'chromium',
- 'src',
- 'pprof')
-
# Heap Profile Dump versions
# DUMP_DEEP_1 is OBSOLETE.
@@ -570,7 +563,7 @@ class Log(object):
sys.stderr.write('total: %d\n' % (total))
-def update_symbols(symbol_path, mapping_lines, chrome_path):
+def update_symbols(symbol_path, mapping_lines, maps_path):
"""Updates address/symbol mapping on memory and in a .symbol cache file.
It reads cached address/symbol mapping from a .symbol file if it exists.
@@ -586,7 +579,7 @@ def update_symbols(symbol_path, mapping_lines, chrome_path):
Args:
symbol_path: A string representing a path for a .symbol file.
mapping_lines: A list of strings containing /proc/.../maps.
- chrome_path: A string representing a path for a Chrome binary.
+ maps_path: A string of the path of /proc/.../maps.
"""
with open(symbol_path, mode='a+') as symbol_f:
symbol_lines = symbol_f.readlines()
@@ -599,30 +592,19 @@ def update_symbols(symbol_path, mapping_lines, chrome_path):
a for a in appeared_addresses if a not in address_symbol_dict)
if unresolved_addresses:
- with tempfile.NamedTemporaryFile(
- suffix='maps', prefix="dmprof", mode='w+') as pprof_in:
- with tempfile.NamedTemporaryFile(
- suffix='symbols', prefix="dmprof", mode='w+') as pprof_out:
- for line in mapping_lines:
- pprof_in.write(line)
-
- for address in unresolved_addresses:
- pprof_in.write(address + '\n')
-
- pprof_in.seek(0)
+ prepared_data_dir = tempfile.mkdtemp()
+ try:
+ prepare_symbol_info(maps_path, prepared_data_dir)
- p = subprocess.Popen(
- '%s --symbols %s' % (PPROF_PATH, chrome_path),
- shell=True, stdin=pprof_in, stdout=pprof_out)
- p.wait()
+ symbols = find_runtime_symbols_list(
+ prepared_data_dir, unresolved_addresses)
- pprof_out.seek(0)
- symbols = pprof_out.readlines()
- symbol_f.seek(0, 2)
- for address, symbol in zip(unresolved_addresses, symbols):
- stripped_symbol = symbol.strip()
- address_symbol_dict[address] = stripped_symbol
- symbol_f.write('%s %s\n' % (address, symbol.strip()))
+ for address, symbol in zip(unresolved_addresses, symbols):
+ stripped_symbol = symbol.strip()
+ address_symbol_dict[address] = stripped_symbol
+ symbol_f.write('%s %s\n' % (address, stripped_symbol))
+ finally:
+ shutil.rmtree(prepared_data_dir)
def parse_policy(policy_path):
@@ -769,7 +751,7 @@ Examples:
logs.append(new_log)
sys.stderr.write('getting symbols\n')
- update_symbols(symbol_path, maps_lines, chrome_path)
+ update_symbols(symbol_path, maps_lines, maps_path)
# TODO(dmikurube): Many modes now. Split them into separete functions.
if action == '--stacktrace':
« no previous file with comments | « no previous file | tools/deep_memory_profiler/download.sh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698