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) 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class V8Profiler(profiler.Profiler): 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) _V8_ARG = '--js-flags=--logfile=%s --prof --log-timer-events' 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @classmethod 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def name(cls): 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return 'v8' 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @classmethod 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def is_supported(cls, browser_type): 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return not browser_type.startswith('cros') 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @classmethod 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def CustomizeBrowserOptions(cls, browser_type, options): 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if browser_type.startswith('android'): 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) dump_file = '/data/local/tmp/v8-profile.log' 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else: 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) dump_file = tempfile.mkstemp()[1] 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) options.AppendExtraBrowserArgs([cls._V8_ARG % dump_file, '--no-sandbox']) 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def CollectProfile(self): 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) # Find output filename from browser argument. 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for i in self._browser_backend.browser_options.extra_browser_args: 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) match = re.match(self._V8_ARG % '(\S+)', i) 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if match: 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) output_file = match.groups(0)[0] 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assert output_file 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) # On Android pull the output file to the host. 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if self._platform_backend.GetOSName() == 'android': 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) host_output_file = '%s.log' % self._output_path 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu self._browser_backend.adb.device().old_interface.Adb().Pull( 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu output_file, host_output_file) 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) # Clean the device 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) self._browser_backend.adb.device().RunShellCommand('rm %s' % output_file) 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) output_file = host_output_file 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) print 'V8 profile saved as %s' % output_file 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) print 'To view, open in ' \ 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'http://v8.googlecode.com/svn/trunk/tools/tick-processor.html' 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return [output_file] 50