Chromium Code Reviews| Index: systrace/systrace/run_systrace.py |
| diff --git a/systrace/systrace/systrace.py b/systrace/systrace/run_systrace.py |
| similarity index 62% |
| rename from systrace/systrace/systrace.py |
| rename to systrace/systrace/run_systrace.py |
| index 738164b69be6ad792a458a3daacea85fda29decb..32fcd4fb709bab3830b1c175fed76345f4b4915b 100755 |
| --- a/systrace/systrace/systrace.py |
| +++ b/systrace/systrace/run_systrace.py |
| @@ -1,6 +1,6 @@ |
| #!/usr/bin/env python |
|
Zhen Wang
2016/03/14 17:11:27
+ccraik, do we need to keep the old file name (sys
alexandermont
2016/03/14 22:19:28
FYI, the reason that I changed the name systrace.p
Zhen Wang
2016/03/16 16:54:29
If you change it to run_systrace.py, you will also
|
| -# Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +# Copyright (c) 2016 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. |
| @@ -11,6 +11,9 @@ the kernel. It creates an HTML file for visualizing the trace. |
| """ |
| import sys |
| +import time |
| +from devil.utils import cmd_helper |
| +from systrace import systrace_tracing_controller |
| # Make sure we're using a new enough version of Python. |
| # The flags= parameter of re.sub() is new in Python 2.7. And Systrace does not |
| @@ -21,15 +24,9 @@ if version != (2, 7): |
| 'Please use Python 2.7.\n' % version) |
| sys.exit(1) |
| -import imp |
| import optparse |
| import os |
| - |
| -# The default agent directory. |
| -DEFAULT_AGENT_DIR = 'agents' |
| - |
| - |
| def parse_options(argv): |
| """Parses and checks the command-line options. |
| @@ -44,6 +41,9 @@ def parse_options(argv): |
| default='trace.html', metavar='FILE') |
| parser.add_option('-t', '--time', dest='trace_time', type='int', |
| help='trace for N seconds', metavar='N') |
| + parser.add_option('-i', '--interrupt', dest='interrupt', default=False, |
|
Chris Craik
2016/03/12 02:02:34
How would folks feel about making this the default
Zhen Wang
2016/03/14 17:11:27
+1
alexandermont
2016/03/14 22:19:28
Done
|
| + action='store_true', help='keep tracing until' |
| + ' interrupted by user pressing control-C') |
| parser.add_option('-b', '--buf-size', dest='trace_buf_size', type='int', |
| help='use a trace buffer size of N KB', metavar='N') |
| parser.add_option('-k', '--ktrace', dest='kfuncs', action='store', |
| @@ -89,7 +89,7 @@ def parse_options(argv): |
| ' The directories should be comma separated, e.g., ' |
| '--agent-dirs=dir1,dir2,dir3. Directory |%s| is the default' |
| ' agent directory and will always be checked.' |
| - % DEFAULT_AGENT_DIR) |
| + % systrace_tracing_controller.DEFAULT_AGENT_DIR) |
| parser.add_option('--target', dest='target', default='android', type='string', |
| help='chose tracing target (android or linux)') |
| @@ -106,113 +106,41 @@ def parse_options(argv): |
| return (options, categories) |
| - |
| -def write_trace_html(html_filename, script_dir, agents): |
| - """Writes out a trace html file. |
| - |
| - Args: |
| - html_filename: The name of the file to write. |
| - script_dir: The directory containing this script. |
| - agents: The systrace agents. |
| - """ |
| - systrace_dir = os.path.abspath(os.path.dirname(__file__)) |
| - html_prefix = read_asset(systrace_dir, 'prefix.html') |
| - html_suffix = read_asset(systrace_dir, 'suffix.html') |
| - trace_viewer_html = read_asset(script_dir, 'systrace_trace_viewer.html') |
| - |
| - # Open the file in binary mode to prevent python from changing the |
| - # line endings. |
| - html_file = open(html_filename, 'wb') |
| - html_file.write(html_prefix.replace('{{SYSTRACE_TRACE_VIEWER_HTML}}', |
| - trace_viewer_html)) |
| - |
| - html_file.write('<!-- BEGIN TRACE -->\n') |
| - for a in agents: |
| - html_file.write(' <script class="') |
| - html_file.write(a.get_class_name()) |
| - html_file.write('" type="application/text">\n') |
| - html_file.write(a.get_trace_data()) |
| - html_file.write(' </script>\n') |
| - html_file.write('<!-- END TRACE -->\n') |
| - |
| - html_file.write(html_suffix) |
| - html_file.close() |
| - print '\n wrote file://%s\n' % os.path.abspath(html_filename) |
| - |
| - |
| -def create_agents(options, categories): |
| - """Create systrace agents. |
| - |
| - This function will search systrace agent modules in agent directories and |
| - create the corresponding systrace agents. |
| - Args: |
| - options: The command-line options. |
| - categories: The trace categories to capture. |
| - Returns: |
| - The list of systrace agents. |
| - """ |
| - agent_dirs = [os.path.join(os.path.dirname(__file__), DEFAULT_AGENT_DIR)] |
| - if options.agent_dirs: |
| - agent_dirs.extend(options.agent_dirs.split(',')) |
| - |
| - agents = [] |
| - for agent_dir in agent_dirs: |
| - if not agent_dir: |
| - continue |
| - for filename in os.listdir(agent_dir): |
| - (module_name, ext) = os.path.splitext(filename) |
| - if (ext != '.py' or module_name == '__init__' |
| - or module_name.endswith('_unittest')): |
| - continue |
| - (f, pathname, data) = imp.find_module(module_name, [agent_dir]) |
| - try: |
| - module = imp.load_module(module_name, f, pathname, data) |
| - finally: |
| - if f: |
| - f.close() |
| - if module: |
| - agent = module.try_create_agent(options, categories) |
| - if not agent: |
| - continue |
| - agents.append(agent) |
| - return agents |
| - |
| +def get_device_serials(): |
| + cmdout = cmd_helper.GetCmdOutput(['adb', 'devices']) |
| + lines = [x.split() for x in cmdout.splitlines()[1:-1]] |
| + return [x[0] for x in lines if x[1] == 'device'] |
| def main(): |
| options, categories = parse_options(sys.argv) |
| - agents = create_agents(options, categories) |
| - |
| - if not agents: |
| - dirs = DEFAULT_AGENT_DIR |
| - if options.agent_dirs: |
| - dirs += ',' + options.agent_dirs |
| - sys.stderr.write('No systrace agent is available in directories |%s|.\n' % |
| - dirs) |
| - sys.exit(1) |
| - |
| - try: |
| - from . import update_systrace_trace_viewer |
| - except ImportError: |
| - pass |
| - else: |
| - update_systrace_trace_viewer.update() |
| - |
| - for a in agents: |
| - a.start() |
| - |
| - for a in agents: |
| - a.collect_result() |
| - if not a.expect_trace(): |
| - # Nothing more to do. |
| - return |
| - |
| + if not options.device_serial: |
| + devices = get_device_serials() |
| + if len(devices) == 0: |
| + raise RuntimeError('No ADB devices connected.') |
| + elif len(devices) >= 2: |
| + raise RuntimeError('Multiple devices connected, serial number required') |
| + options.device_serial = devices[0] |
| script_dir = os.path.dirname(os.path.abspath(sys.argv[0])) |
| - write_trace_html(options.output_file, script_dir, agents) |
| - |
| - |
| -def read_asset(src_dir, filename): |
| - return open(os.path.join(src_dir, filename)).read() |
| + controller = systrace_tracing_controller.SystraceTracingController( |
| + script_dir, options, categories) |
| + controller.StartTracing() |
| + if options.from_file is not None: |
| + print 'Reading results from file.' |
| + elif options.interrupt: |
| + print 'Starting tracing (stop with control-C)' |
| + while True: |
| + try: |
| + time.sleep(0.5) |
| + except KeyboardInterrupt: |
| + break |
| + else: |
| + print 'Starting tracing (%d seconds)' % options.trace_time |
| + time.sleep(options.trace_time) |
| + print 'Tracing completed. Collecting output...' |
| + controller.StopTracing() |
| + print 'Outputting Systrace results...' |
| + controller.OutputSystraceResults() |
| if __name__ == '__main__' and __package__ is None: |
| # Add current package to search path. |