blob: a40b6eba6cd76d77cc5f84c92ae0cd235308086d [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright 2021 The Chromium Authors
# 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())