v8_profiler.py revision f2477e01787aa58f445919b809d89e252beef54f
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import re
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import tempfile
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from telemetry.core.platform import profiler
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class V8Profiler(profiler.Profiler):
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  _V8_ARG = '--js-flags=--logfile=%s --prof --log-timer-events'
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  @classmethod
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def name(cls):
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return 'v8'
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  @classmethod
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def is_supported(cls, browser_type):
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return not browser_type.startswith('cros')
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  @classmethod
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def CustomizeBrowserOptions(cls, browser_type, options):
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if browser_type.startswith('android'):
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      dump_file = '/data/local/tmp/v8-profile.log'
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    else:
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      dump_file = tempfile.mkstemp()[1]
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    options.AppendExtraBrowserArgs([cls._V8_ARG % dump_file, '--no-sandbox'])
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def CollectProfile(self):
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    # Find output filename from browser argument.
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for i in self._browser_backend.browser_options.extra_browser_args:
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      match = re.match(self._V8_ARG % '(\S+)', i)
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if match:
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        output_file = match.groups(0)[0]
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    assert output_file
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    # On Android pull the output file to the host.
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if self._platform_backend.GetOSName() == 'android':
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      host_output_file = '%s.log' % self._output_path
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      self._browser_backend.adb.Adb().Adb().Pull(output_file, host_output_file)
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      # Clean the device
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      self._browser_backend.adb.Adb().RunShellCommand('rm %s' % output_file)
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      output_file = host_output_file
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    print 'V8 profile saved as %s' % output_file
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    print 'To view, open in ' \
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          'http://v8.googlecode.com/svn/trunk/tools/tick-processor.html'
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return [output_file]
48