| Index: tools/telemetry/telemetry/internal/platform/profiler/vtune_profiler.py
|
| diff --git a/tools/telemetry/telemetry/internal/platform/profiler/vtune_profiler.py b/tools/telemetry/telemetry/internal/platform/profiler/vtune_profiler.py
|
| deleted file mode 100644
|
| index d9a2fac09c0dc748ed7017e9c6b0e3bf88dc90a8..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/telemetry/internal/platform/profiler/vtune_profiler.py
|
| +++ /dev/null
|
| @@ -1,155 +0,0 @@
|
| -# 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
|
| -import subprocess
|
| -import sys
|
| -import tempfile
|
| -
|
| -from telemetry.core import exceptions
|
| -from telemetry.internal.platform import profiler
|
| -from telemetry.internal.platform.profiler import android_profiling_helper
|
| -
|
| -
|
| -class _SingleProcessVTuneProfiler(object):
|
| - """An internal class for using vtune for a given process."""
|
| - def __init__(self, pid, output_file, browser_backend, platform_backend):
|
| - self._pid = pid
|
| - self._browser_backend = browser_backend
|
| - self._platform_backend = platform_backend
|
| - self._output_file = output_file
|
| - self._tmp_output_file = tempfile.NamedTemporaryFile('w', 0)
|
| - cmd = ['amplxe-cl', '-collect', 'hotspots',
|
| - '-target-pid', str(pid), '-r', self._output_file]
|
| - self._is_android = platform_backend.GetOSName() == 'android'
|
| - if self._is_android:
|
| - cmd += ['-target-system', 'android']
|
| -
|
| - self._proc = subprocess.Popen(
|
| - cmd, stdout=self._tmp_output_file, stderr=subprocess.STDOUT)
|
| -
|
| - def CollectProfile(self):
|
| - if 'renderer' in self._output_file:
|
| - try:
|
| - self._platform_backend.GetCommandLine(self._pid)
|
| - except exceptions.ProcessGoneException:
|
| - logging.warning('Renderer was swapped out during profiling. '
|
| - 'To collect a full profile rerun with '
|
| - '"--extra-browser-args=--single-process"')
|
| - subprocess.call(['amplxe-cl', '-command', 'stop', '-r', self._output_file])
|
| -
|
| - exit_code = self._proc.wait()
|
| - try:
|
| - # 1: amplxe: Error: Cannot find a running process with the specified ID.
|
| - # Provide a valid PID.
|
| - if exit_code not in (0, 1):
|
| - raise Exception(
|
| - 'amplxe-cl failed with exit code %d. Output:\n%s' % (exit_code,
|
| - self._GetStdOut()))
|
| - finally:
|
| - self._tmp_output_file.close()
|
| -
|
| - if exit_code:
|
| - # The renderer process was swapped out. Now that we made sure VTune has
|
| - # stopped, return without further processing the invalid profile.
|
| - return self._output_file
|
| -
|
| - if self._is_android:
|
| - required_libs = \
|
| - android_profiling_helper.GetRequiredLibrariesForVTuneProfile(
|
| - self._output_file)
|
| -
|
| - device = self._browser_backend.device
|
| - symfs_root = os.path.dirname(self._output_file)
|
| - android_profiling_helper.CreateSymFs(device,
|
| - symfs_root,
|
| - required_libs,
|
| - use_symlinks=True)
|
| - logging.info('Resolving symbols in profile.')
|
| - subprocess.call(['amplxe-cl', '-finalize', '-r', self._output_file,
|
| - '-search-dir', symfs_root])
|
| -
|
| - print 'To view the profile, run:'
|
| - print ' amplxe-gui %s' % self._output_file
|
| -
|
| - return self._output_file
|
| -
|
| - def _GetStdOut(self):
|
| - self._tmp_output_file.flush()
|
| - try:
|
| - with open(self._tmp_output_file.name) as f:
|
| - return f.read()
|
| - except IOError:
|
| - return ''
|
| -
|
| -
|
| -class VTuneProfiler(profiler.Profiler):
|
| -
|
| - def __init__(self, browser_backend, platform_backend, output_path, state):
|
| - super(VTuneProfiler, self).__init__(
|
| - browser_backend, platform_backend, output_path, state)
|
| - process_output_file_map = self._GetProcessOutputFileMap()
|
| - self._process_profilers = []
|
| -
|
| - has_renderer = False
|
| - for pid, output_file in process_output_file_map.iteritems():
|
| - if 'renderer' in output_file:
|
| - has_renderer = True
|
| - break
|
| -
|
| - for pid, output_file in process_output_file_map.iteritems():
|
| - if has_renderer:
|
| - if not 'renderer' in output_file:
|
| - continue
|
| - elif not 'browser0' in output_file:
|
| - continue
|
| -
|
| - self._process_profilers.append(
|
| - _SingleProcessVTuneProfiler(pid, output_file, browser_backend,
|
| - platform_backend))
|
| -
|
| - @classmethod
|
| - def name(cls):
|
| - return 'vtune'
|
| -
|
| - @classmethod
|
| - def is_supported(cls, browser_type):
|
| - if sys.platform != 'linux2':
|
| - return False
|
| - if browser_type.startswith('cros'):
|
| - return False
|
| - try:
|
| - proc = subprocess.Popen(['amplxe-cl', '-version'],
|
| - stderr=subprocess.STDOUT,
|
| - stdout=subprocess.PIPE)
|
| - proc.communicate()
|
| - if proc.returncode != 0:
|
| - return False
|
| -
|
| - if browser_type.startswith('android'):
|
| - # VTune checks if 'su' is available on the device.
|
| - proc = subprocess.Popen(['adb', 'shell', 'su', '-c', 'id'],
|
| - stderr=subprocess.STDOUT,
|
| - stdout=subprocess.PIPE)
|
| - return 'not found' not in proc.communicate()[0]
|
| -
|
| - return True
|
| - except OSError:
|
| - return False
|
| -
|
| - @classmethod
|
| - def CustomizeBrowserOptions(cls, browser_type, options):
|
| - options.AppendExtraBrowserArgs([
|
| - '--no-sandbox',
|
| - '--allow-sandbox-debugging',
|
| - ])
|
| -
|
| - def CollectProfile(self):
|
| - print 'Processing profile, this will take a few minutes...'
|
| -
|
| - output_files = []
|
| - for single_process in self._process_profilers:
|
| - output_files.append(single_process.CollectProfile())
|
| - return output_files
|
|
|