Index: sky/tools/shelldb |
diff --git a/sky/tools/shelldb b/sky/tools/shelldb |
index 087bb398894aaa1fabf505b7208322c7adf570e6..b52bd27b5aaf101333fc91601f5077de102b8bac 100755 |
--- a/sky/tools/shelldb |
+++ b/sky/tools/shelldb |
@@ -8,8 +8,10 @@ import argparse |
import json |
import logging |
import os |
+import re |
import subprocess |
import sys |
+import time |
import urlparse |
SKY_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) |
@@ -228,6 +230,49 @@ class Analyze(object): |
] |
subprocess.call(analyzer_args) |
+class StartTracing(object): |
+ def add_subparser(self, subparsers): |
+ start_tracing_parser = subparsers.add_parser('start_tracing', |
+ help=('start tracing a running sky instance')) |
+ start_tracing_parser.set_defaults(func=self.run) |
+ |
+ def run(self, args, pids): |
+ subprocess.check_output([ADB_PATH, 'shell', |
+ 'am', 'broadcast', |
+ '-a', 'org.domokit.sky.demo.TRACING_START']) |
+ |
+ |
+TRACE_COMPLETE_REGEXP = re.compile('Trace complete') |
+TRACE_FILE_REGEXP = re.compile(r'Saving trace to (?P<path>\S+)') |
+ |
+class StopTracing(object): |
+ def add_subparser(self, subparsers): |
+ stop_tracing_parser = subparsers.add_parser('stop_tracing', |
+ help=('stop tracing a running sky instance')) |
+ stop_tracing_parser.set_defaults(func=self.run) |
+ |
+ def run(self, args, pids): |
+ subprocess.check_output([ADB_PATH, 'logcat', '-c']) |
+ subprocess.check_output([ADB_PATH, 'shell', |
+ 'am', 'broadcast', |
+ '-a', 'org.domokit.sky.demo.TRACING_STOP']) |
+ device_path = None |
+ is_complete = False |
+ while not is_complete: |
+ time.sleep(0.2) |
+ log = subprocess.check_output([ADB_PATH, 'logcat', '-d']) |
+ if device_path is None: |
+ result = TRACE_FILE_REGEXP.search(log) |
+ if result: |
+ device_path = result.group('path') |
+ is_complete = TRACE_COMPLETE_REGEXP.search(log) is not None |
+ |
+ print 'Downloading trace %s ...' % os.path.basename(device_path) |
+ |
+ if device_path: |
+ subprocess.check_output([ADB_PATH, 'pull', device_path]) |
+ subprocess.check_output([ADB_PATH, 'shell', 'rm', device_path]) |
+ |
class SkyShellRunner(object): |
def main(self): |
@@ -236,7 +281,15 @@ class SkyShellRunner(object): |
parser = argparse.ArgumentParser(description='Sky Shell Runner') |
subparsers = parser.add_subparsers(help='sub-command help') |
- for command in [StartSky(), StopSky(), Analyze()]: |
+ commands = [ |
+ StartSky(), |
+ StopSky(), |
+ Analyze(), |
+ StartTracing(), |
+ StopTracing(), |
+ ] |
+ |
+ for command in commands: |
command.add_subparser(subparsers) |
args = parser.parse_args() |