Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # |
Avi Drissman | dfd88085 | 2022-09-15 20:11:09 | [diff] [blame] | 3 | # Copyright 2021 The Chromium Authors |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 4 | # Use of this source code is governed by a BSD-style license that can be |
| 5 | # found in the LICENSE file. |
| 6 | """ |
| 7 | This executable script runs perfetto traces on the specified device. |
| 8 | See the README.md file for more information. |
| 9 | """ |
| 10 | |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 11 | import os |
| 12 | import sys |
Ryan Huckleberry | 679263c | 2021-07-16 21:59:01 | [diff] [blame] | 13 | import optparse |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 14 | |
| 15 | import adb_profile_chrome_startup |
Ryan Huckleberry | 679263c | 2021-07-16 21:59:01 | [diff] [blame] | 16 | import symbolize_trace |
| 17 | import flag_utils |
Uwem Wilson | d4f50c7 | 2021-08-02 22:03:50 | [diff] [blame] | 18 | import display_in_browser |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 19 | |
Ryan Huckleberry | dd9912c | 2021-08-03 19:19:00 | [diff] [blame] | 20 | |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 21 | sys.path.insert(0, os.path.join(os.path.dirname(__file__), |
| 22 | os.pardir, os.pardir, 'third_party', |
| 23 | 'catapult', 'systrace')) |
| 24 | |
Ryan Huckleberry | 679263c | 2021-07-16 21:59:01 | [diff] [blame] | 25 | from systrace import util |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 26 | from profile_chrome import chrome_startup_tracing_agent |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 27 | |
| 28 | |
| 29 | def _CreateOptionParser(): |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 30 | 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 Huckleberry | dd9912c | 2021-08-03 19:19:00 | [diff] [blame] | 35 | 'profiling.', usage='%prog [options]', |
| 36 | prog='tools/tracing/profile_chrome_startup', |
| 37 | conflict_handler='resolve') |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 38 | |
Ryan Huckleberry | dd9912c | 2021-08-03 19:19:00 | [diff] [blame] | 39 | parser.add_option_group(flag_utils.GeneralOptions(parser)) |
| 40 | parser.add_option_group(flag_utils.ProfileOptions(parser)) |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 41 | parser.add_option_group(chrome_startup_tracing_agent.add_options(parser)) |
Ryan Huckleberry | 679263c | 2021-07-16 21:59:01 | [diff] [blame] | 42 | parser.add_option_group(flag_utils.SymbolizeOptions(parser)) |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 43 | |
| 44 | return parser |
| 45 | |
Uwem Wilson | cab553f | 2021-07-29 17:29:09 | [diff] [blame] | 46 | |
Ryan Huckleberry | dd9912c | 2021-08-03 19:19:00 | [diff] [blame] | 47 | def _SetupFlags(options): |
Ryan Huckleberry | dd9912c | 2021-08-03 19:19:00 | [diff] [blame] | 48 | flag_utils.SetupLogging(options.verbosity) |
ssid | 2266735 | 2021-11-29 21:06:53 | [diff] [blame] | 49 | flag_utils.SetupProfilingCategories(options) |
Uwem Wilson | cab553f | 2021-07-29 17:29:09 | [diff] [blame] | 50 | |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 51 | |
| 52 | def main(): |
| 53 | parser = _CreateOptionParser() |
| 54 | options, _ = parser.parse_args() |
| 55 | |
Ryan Huckleberry | dd9912c | 2021-08-03 19:19:00 | [diff] [blame] | 56 | _SetupFlags(options) |
Ryan Huckleberry | 679263c | 2021-07-16 21:59:01 | [diff] [blame] | 57 | |
Ryan Huckleberry | 945bbf3 | 2021-07-08 22:33:53 | [diff] [blame] | 58 | # Run Tracing |
| 59 | trace_file = None |
| 60 | if options.platform.lower() == 'android': |
Alison Gale | 3a395916 | 2024-04-29 18:52:44 | [diff] [blame] | 61 | # TODO(crbug.com/40193989): Fix manual tracing. Setting flag --time=0 stalls and fails |
Ryan Huckleberry | dd9912c | 2021-08-03 19:19:00 | [diff] [blame] | 62 | # to download the collected trace. |
Ryan Huckleberry | 945bbf3 | 2021-07-08 22:33:53 | [diff] [blame] | 63 | trace_file = adb_profile_chrome_startup.ProfileChrome(options) |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 64 | else: |
Ryan Huckleberry | 7a8116369 | 2021-07-22 21:56:51 | [diff] [blame] | 65 | raise Exception('Platform "%s" is not supported. ' |
Ryan Huckleberry | ddfa54c | 2021-08-06 18:48:04 | [diff] [blame] | 66 | 'Specify platform with the --platform flag.' |
Uwem Wilson | a6e5aaa | 2021-08-03 19:20:06 | [diff] [blame] | 67 | % (options.platform)) |
| 68 | |
| 69 | print('Wrote unsymbolized trace to {path}'.format( |
| 70 | path=os.path.abspath(trace_file))) |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 71 | |
Ryan Huckleberry | 679263c | 2021-07-16 21:59:01 | [diff] [blame] | 72 | # Symbolize Trace |
Ryan Huckleberry | 855b1af | 2021-08-12 01:10:36 | [diff] [blame] | 73 | if not options.skip_symbolize: |
Ryan Huckleberry | dd9912c | 2021-08-03 19:19:00 | [diff] [blame] | 74 | 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 Huckleberry | 679263c | 2021-07-16 21:59:01 | [diff] [blame] | 77 | |
Uwem Wilson | d4f50c7 | 2021-08-02 22:03:50 | [diff] [blame] | 78 | if options.view: |
ssid | 2266735 | 2021-11-29 21:06:53 | [diff] [blame] | 79 | 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 Wilson | d4f50c7 | 2021-08-02 22:03:50 | [diff] [blame] | 88 | |
Ryan Huckleberry | 9ace138 | 2021-06-25 21:15:39 | [diff] [blame] | 89 | if __name__ == '__main__': |
| 90 | sys.exit(main()) |