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

Side by Side Diff: build/android/chrome_profiler/perf_controller.py

Issue 321163005: adb_profile_chrome: Show interactive perf command (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import logging 5 import logging
6 import os 6 import os
7 import subprocess 7 import subprocess
8 import sys 8 import sys
9 import tempfile 9 import tempfile
10 10
11 from chrome_profiler import controllers 11 from chrome_profiler import controllers
12 from chrome_profiler import ui
12 13
13 from pylib import android_commands 14 from pylib import android_commands
14 from pylib import constants 15 from pylib import constants
15 from pylib.perf import perf_control 16 from pylib.perf import perf_control
16 17
17 sys.path.append(os.path.join(constants.DIR_SOURCE_ROOT, 18 sys.path.append(os.path.join(constants.DIR_SOURCE_ROOT,
18 'tools', 19 'tools',
19 'telemetry')) 20 'telemetry'))
20 try: 21 try:
21 # pylint: disable=F0401 22 # pylint: disable=F0401
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 def StartTracing(self, _): 122 def StartTracing(self, _):
122 self._perf_instance = _PerfProfiler(self._device, 123 self._perf_instance = _PerfProfiler(self._device,
123 self._perf_binary, 124 self._perf_binary,
124 self._categories) 125 self._categories)
125 126
126 def StopTracing(self): 127 def StopTracing(self):
127 if not self._perf_instance: 128 if not self._perf_instance:
128 return 129 return
129 self._perf_instance.SignalAndWait() 130 self._perf_instance.SignalAndWait()
130 131
132 @staticmethod
133 def _GetInteractivePerfCommand(perfhost_path, perf_profile, symfs_dir,
134 required_libs, kallsyms):
135 cmd = '%s report -n -i %s --symfs %s --kallsyms %s' % (
136 os.path.relpath(perfhost_path, '.'), perf_profile, symfs_dir, kallsyms)
137 for lib in required_libs:
138 lib = os.path.join(symfs_dir, lib[1:])
139 if not os.path.exists(lib):
140 continue
141 objdump_path = android_profiling_helper.GetToolchainBinaryPath(
Dominik Grewe 2014/06/10 16:48:17 I can't find this method anywhere? Did you mean to
142 lib, 'objdump')
143 if objdump_path:
144 cmd += ' --objdump %s' % os.path.relpath(objdump_path, '.')
145 break
146 return cmd
147
131 def PullTrace(self): 148 def PullTrace(self):
132 symfs_dir = os.path.join(tempfile.gettempdir(), 149 symfs_dir = os.path.join(tempfile.gettempdir(),
133 os.path.expandvars('$USER-perf-symfs')) 150 os.path.expandvars('$USER-perf-symfs'))
134 if not os.path.exists(symfs_dir): 151 if not os.path.exists(symfs_dir):
135 os.makedirs(symfs_dir) 152 os.makedirs(symfs_dir)
136 required_libs = set() 153 required_libs = set()
137 154
138 # Download the recorded perf profile. 155 # Download the recorded perf profile.
139 perf_profile = self._perf_instance.PullResult(symfs_dir) 156 perf_profile = self._perf_instance.PullResult(symfs_dir)
140 required_libs = \ 157 required_libs = \
141 android_profiling_helper.GetRequiredLibrariesForPerfProfile( 158 android_profiling_helper.GetRequiredLibrariesForPerfProfile(
142 perf_profile) 159 perf_profile)
143 if not required_libs: 160 if not required_libs:
144 logging.warning('No libraries required by perf trace. Most likely there ' 161 logging.warning('No libraries required by perf trace. Most likely there '
145 'are no samples in the trace.') 162 'are no samples in the trace.')
146 163
147 # Build a symfs with all the necessary libraries. 164 # Build a symfs with all the necessary libraries.
148 kallsyms = android_profiling_helper.CreateSymFs(self._device, 165 kallsyms = android_profiling_helper.CreateSymFs(self._device,
149 symfs_dir, 166 symfs_dir,
150 required_libs, 167 required_libs,
151 use_symlinks=False) 168 use_symlinks=False)
152 # Convert the perf profile into JSON.
153 perfhost_path = os.path.abspath(support_binaries.FindPath( 169 perfhost_path = os.path.abspath(support_binaries.FindPath(
154 'perfhost', 'linux')) 170 'perfhost', 'linux'))
171
172 ui.PrintMessage('\nNote: to view the profile in perf, run:')
173 ui.PrintMessage(' ' + self._GetInteractivePerfCommand(perfhost_path,
174 perf_profile, symfs_dir, required_libs, kallsyms))
175
176 # Convert the perf profile into JSON.
155 perf_script_path = os.path.join(constants.DIR_SOURCE_ROOT, 177 perf_script_path = os.path.join(constants.DIR_SOURCE_ROOT,
156 'tools', 'telemetry', 'telemetry', 'core', 'platform', 'profiler', 178 'tools', 'telemetry', 'telemetry', 'core', 'platform', 'profiler',
157 'perf_vis', 'perf_to_tracing.py') 179 'perf_vis', 'perf_to_tracing.py')
158 json_file_name = os.path.basename(perf_profile) 180 json_file_name = os.path.basename(perf_profile)
159 with open(os.devnull, 'w') as dev_null, \ 181 with open(os.devnull, 'w') as dev_null, \
160 open(json_file_name, 'w') as json_file: 182 open(json_file_name, 'w') as json_file:
161 cmd = [perfhost_path, 'script', '-s', perf_script_path, '-i', 183 cmd = [perfhost_path, 'script', '-s', perf_script_path, '-i',
162 perf_profile, '--symfs', symfs_dir, '--kallsyms', kallsyms] 184 perf_profile, '--symfs', symfs_dir, '--kallsyms', kallsyms]
163 subprocess.call(cmd, stdout=json_file, stderr=dev_null) 185 subprocess.call(cmd, stdout=json_file, stderr=dev_null)
164 return json_file_name 186 return json_file_name
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698