blob: af1de5f946fff3be09c1f9483dab39e3da6f96db [file] [log] [blame]
Ryan Huckleberry9ace1382021-06-25 21:15:391#!/usr/bin/env python
2#
Avi Drissmandfd880852022-09-15 20:11:093# Copyright 2021 The Chromium Authors
Ryan Huckleberry9ace1382021-06-25 21:15:394# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6"""
7This executable script runs perfetto traces on the specified device.
8See the README.md file for more information.
9"""
10
Ryan Huckleberry9ace1382021-06-25 21:15:3911import os
12import sys
Ryan Huckleberry679263c2021-07-16 21:59:0113import optparse
Ryan Huckleberry9ace1382021-06-25 21:15:3914
15import adb_profile_chrome_startup
Ryan Huckleberry679263c2021-07-16 21:59:0116import symbolize_trace
17import flag_utils
Uwem Wilsond4f50c72021-08-02 22:03:5018import display_in_browser
Ryan Huckleberry9ace1382021-06-25 21:15:3919
Ryan Huckleberrydd9912c2021-08-03 19:19:0020
Ryan Huckleberry9ace1382021-06-25 21:15:3921sys.path.insert(0, os.path.join(os.path.dirname(__file__),
22 os.pardir, os.pardir, 'third_party',
23 'catapult', 'systrace'))
24
Ryan Huckleberry679263c2021-07-16 21:59:0125from systrace import util
Ryan Huckleberry9ace1382021-06-25 21:15:3926from profile_chrome import chrome_startup_tracing_agent
Ryan Huckleberry9ace1382021-06-25 21:15:3927
28
29def _CreateOptionParser():
Ryan Huckleberry9ace1382021-06-25 21:15:3930 parser = optparse.OptionParser(description='Record Perfetto tracing profiles '
31 'from Android browsers startup. See '
32 'http://dev.chromium.org'
33 '/developers/how-tos/trace-event-profiling-'
34 'tool for detailed instructions for '
Ryan Huckleberrydd9912c2021-08-03 19:19:0035 'profiling.', usage='%prog [options]',
36 prog='tools/tracing/profile_chrome_startup',
37 conflict_handler='resolve')
Ryan Huckleberry9ace1382021-06-25 21:15:3938
Ryan Huckleberrydd9912c2021-08-03 19:19:0039 parser.add_option_group(flag_utils.GeneralOptions(parser))
40 parser.add_option_group(flag_utils.ProfileOptions(parser))
Ryan Huckleberry9ace1382021-06-25 21:15:3941 parser.add_option_group(chrome_startup_tracing_agent.add_options(parser))
Ryan Huckleberry679263c2021-07-16 21:59:0142 parser.add_option_group(flag_utils.SymbolizeOptions(parser))
Ryan Huckleberry9ace1382021-06-25 21:15:3943
44 return parser
45
Uwem Wilsoncab553f2021-07-29 17:29:0946
Ryan Huckleberrydd9912c2021-08-03 19:19:0047def _SetupFlags(options):
Ryan Huckleberrydd9912c2021-08-03 19:19:0048 flag_utils.SetupLogging(options.verbosity)
ssid22667352021-11-29 21:06:5349 flag_utils.SetupProfilingCategories(options)
Uwem Wilsoncab553f2021-07-29 17:29:0950
Ryan Huckleberry9ace1382021-06-25 21:15:3951
52def main():
53 parser = _CreateOptionParser()
54 options, _ = parser.parse_args()
55
Ryan Huckleberrydd9912c2021-08-03 19:19:0056 _SetupFlags(options)
Ryan Huckleberry679263c2021-07-16 21:59:0157
Ryan Huckleberry945bbf32021-07-08 22:33:5358 # Run Tracing
59 trace_file = None
60 if options.platform.lower() == 'android':
Alison Gale3a3959162024-04-29 18:52:4461 # TODO(crbug.com/40193989): Fix manual tracing. Setting flag --time=0 stalls and fails
Ryan Huckleberrydd9912c2021-08-03 19:19:0062 # to download the collected trace.
Ryan Huckleberry945bbf32021-07-08 22:33:5363 trace_file = adb_profile_chrome_startup.ProfileChrome(options)
Ryan Huckleberry9ace1382021-06-25 21:15:3964 else:
Ryan Huckleberry7a81163692021-07-22 21:56:5165 raise Exception('Platform "%s" is not supported. '
Ryan Huckleberryddfa54c2021-08-06 18:48:0466 'Specify platform with the --platform flag.'
Uwem Wilsona6e5aaa2021-08-03 19:20:0667 % (options.platform))
68
69 print('Wrote unsymbolized trace to {path}'.format(
70 path=os.path.abspath(trace_file)))
Ryan Huckleberry9ace1382021-06-25 21:15:3971
Ryan Huckleberry679263c2021-07-16 21:59:0172 # Symbolize Trace
Ryan Huckleberry855b1af2021-08-12 01:10:3673 if not options.skip_symbolize:
Ryan Huckleberrydd9912c2021-08-03 19:19:0074 if options.trace_format is None or options.trace_format.lower() != 'proto':
75 raise Exception('Symbolization is currently only supported for protos.')
76 symbolize_trace.SymbolizeTrace(trace_file=trace_file, options=options)
Ryan Huckleberry679263c2021-07-16 21:59:0177
Uwem Wilsond4f50c72021-08-02 22:03:5078 if options.view:
ssid22667352021-11-29 21:06:5379 trace = options.output_file
80 if not trace or not os.path.isfile(trace):
81 trace = trace_file
82
83 if trace and os.path.isfile(trace):
84 display_in_browser.DisplayInBrowser(trace, options.trace_format)
85 else:
86 flag_utils.GetTraceLogger().warning(
87 'Trace is not found, so not opening in browser.')
Uwem Wilsond4f50c72021-08-02 22:03:5088
Ryan Huckleberry9ace1382021-06-25 21:15:3989if __name__ == '__main__':
90 sys.exit(main())