#!/usr/bin/env python # # Copyright 2021 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. """ This executable script runs perfetto traces on the specified device. See the README.md file for more information. """ import os import sys import optparse import adb_profile_chrome_startup import symbolize_trace import flag_utils import display_in_browser sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, 'third_party', 'catapult', 'systrace')) from systrace import util from profile_chrome import chrome_startup_tracing_agent def _CreateOptionParser(): parser = optparse.OptionParser(description='Record Perfetto tracing profiles ' 'from Android browsers startup. See ' 'http://dev.chromium.org' '/developers/how-tos/trace-event-profiling-' 'tool for detailed instructions for ' 'profiling.', usage='%prog [options]', prog='tools/tracing/profile_chrome_startup', conflict_handler='resolve') parser.add_option_group(flag_utils.GeneralOptions(parser)) parser.add_option_group(flag_utils.ProfileOptions(parser)) parser.add_option_group(chrome_startup_tracing_agent.add_options(parser)) parser.add_option_group(flag_utils.SymbolizeOptions(parser)) return parser def _SetupFlags(options): flag_utils.SetupLogging(options.verbosity) flag_utils.SetupProfilingCategories(options) def main(): parser = _CreateOptionParser() options, _ = parser.parse_args() _SetupFlags(options) # Run Tracing trace_file = None if options.platform.lower() == 'android': # TODO(crbug/1239748): Fix manual tracing. Setting flag --time=0 stalls and fails # to download the collected trace. trace_file = adb_profile_chrome_startup.ProfileChrome(options) else: raise Exception('Platform "%s" is not supported. ' 'Specify platform with the --platform flag.' % (options.platform)) print('Wrote unsymbolized trace to {path}'.format( path=os.path.abspath(trace_file))) # Symbolize Trace if not options.skip_symbolize: if options.trace_format is None or options.trace_format.lower() != 'proto': raise Exception('Symbolization is currently only supported for protos.') symbolize_trace.SymbolizeTrace(trace_file=trace_file, options=options) if options.view: trace = options.output_file if not trace or not os.path.isfile(trace): trace = trace_file if trace and os.path.isfile(trace): display_in_browser.DisplayInBrowser(trace, options.trace_format) else: flag_utils.GetTraceLogger().warning( 'Trace is not found, so not opening in browser.') if __name__ == '__main__': sys.exit(main())