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