| Index: tools/ddbg_service/lib/debugger.dart
|
| diff --git a/tools/ddbg_service/lib/debugger.dart b/tools/ddbg_service/lib/debugger.dart
|
| deleted file mode 100644
|
| index 0a041614c772826bcbf6b2c50757bcf86bd448dc..0000000000000000000000000000000000000000
|
| --- a/tools/ddbg_service/lib/debugger.dart
|
| +++ /dev/null
|
| @@ -1,478 +0,0 @@
|
| -// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -library debugger;
|
| -
|
| -import "dart:async";
|
| -import "dart:io";
|
| -
|
| -import "package:ddbg/commando.dart";
|
| -import "package:observatory/service_io.dart";
|
| -
|
| -class Debugger {
|
| - Commando cmdo;
|
| - var _cmdoSubscription;
|
| -
|
| - CommandList _commands;
|
| -
|
| - VM _vm;
|
| - VM get vm => _vm;
|
| - set vm(VM vm) {
|
| - if (_vm == vm) {
|
| - // Do nothing.
|
| - return;
|
| - }
|
| - if (_vm != null) {
|
| - _vm.disconnect();
|
| - }
|
| - if (vm != null) {
|
| - vm.onConnect.then(_vmConnected);
|
| - vm.onDisconnect.then(_vmDisconnected);
|
| - vm.errors.stream.listen(_onServiceError);
|
| - vm.exceptions.stream.listen(_onServiceException);
|
| - vm.events.stream.listen(_onServiceEvent);
|
| - }
|
| - _vm = vm;
|
| - }
|
| -
|
| - _vmConnected(VM vm) {
|
| - cmdo.print('Connected to vm');
|
| - }
|
| -
|
| - _vmDisconnected(VM vm) {
|
| - cmdo.print('Disconnected from vm');
|
| - }
|
| -
|
| - _onServiceError(ServiceError error) {
|
| - cmdo.print('error $error');
|
| - }
|
| -
|
| - _onServiceException(ServiceException exception) {
|
| - cmdo.print('${exception.message}');
|
| - }
|
| -
|
| - _onServiceEvent(ServiceEvent event) {
|
| - switch (event.eventType) {
|
| - case 'GC':
|
| - // Ignore GC events for now.
|
| - break;
|
| - default:
|
| - cmdo.print('event $event');
|
| - break;
|
| - }
|
| - }
|
| -
|
| - VM _isolate;
|
| - VM get isolate => _isolate;
|
| - set isolate(Isolate isolate) {
|
| - _isolate = isolate;
|
| - cmdo.print('Current isolate is now isolate ${getIsolateIndex(_isolate)}');
|
| - }
|
| -
|
| - Map _isolateIndexMap = new Map();
|
| - int _nextIsolateIndex = 0;
|
| - int getIsolateIndex(Isolate isolate) {
|
| - var index = _isolateIndexMap[isolate.id];
|
| - if (index == null) {
|
| - index = _nextIsolateIndex++;
|
| - _isolateIndexMap[isolate.id] = index;
|
| - }
|
| - return index;
|
| - }
|
| -
|
| - void onUncaughtError(error, StackTrace trace) {
|
| - if (error is ServiceException ||
|
| - error is ServiceError) {
|
| - // These are handled elsewhere. Ignore.
|
| - return;
|
| - }
|
| - cmdo.print('\n--------\nExiting due to unexpected error:\n'
|
| - ' $error\n$trace\n');
|
| - quit();
|
| - }
|
| -
|
| - Debugger() {
|
| - cmdo = new Commando(completer: _completeCommand);
|
| - _cmdoSubscription = cmdo.commands.listen(_processCommand,
|
| - onError: _cmdoError,
|
| - onDone: _cmdoDone);
|
| - _commands = new CommandList();
|
| - _commands.register(new AttachCommand());
|
| - _commands.register(new DetachCommand());
|
| - _commands.register(new HelpCommand(_commands));
|
| - _commands.register(new IsolateCommand());
|
| - _commands.register(new QuitCommand());
|
| - }
|
| -
|
| - Future _closeCmdo() {
|
| - var sub = _cmdoSubscription;
|
| - _cmdoSubscription = null;
|
| - cmdo = null;
|
| -
|
| - var future = sub.cancel();
|
| - if (future != null) {
|
| - return future;
|
| - } else {
|
| - return new Future.value();
|
| - }
|
| - }
|
| -
|
| - Future quit() {
|
| - return Future.wait([_closeCmdo()]).then((_) {
|
| - exit(0);
|
| - });
|
| - }
|
| -
|
| - void _cmdoError(error, StackTrace trace) {
|
| - cmdo.print('\n--------\nExiting due to unexpected error:\n'
|
| - ' $error\n$trace\n');
|
| - quit();
|
| - }
|
| -
|
| - void _cmdoDone() {
|
| - quit();
|
| - }
|
| -
|
| - List<String> _completeCommand(List<String> commandParts) {
|
| - return _commands.complete(commandParts);
|
| - }
|
| -
|
| - void _processCommand(String cmdLine) {
|
| - void huh() {
|
| - cmdo.print("'$cmdLine' not understood, try 'help' for help.");
|
| - }
|
| -
|
| - cmdo.hide();
|
| - cmdLine = cmdLine.trim();
|
| - var args = cmdLine.split(' ');
|
| - if (args.length == 0) {
|
| - return;
|
| - }
|
| - var command = args[0];
|
| - var matches = _commands.match(command, true);
|
| - if (matches.length == 0) {
|
| - huh();
|
| - cmdo.show();
|
| - } else if (matches.length == 1) {
|
| - matches[0].run(this, args).then((_) {
|
| - cmdo.show();
|
| - });
|
| - } else {
|
| - var matchNames = matches.map((handler) => handler.name);
|
| - cmdo.print("Ambiguous command '$command' : ${matchNames.toList()}");
|
| - cmdo.show();
|
| - }
|
| - }
|
| -
|
| -}
|
| -
|
| -// Every debugger command extends this base class.
|
| -abstract class Command {
|
| - String get name;
|
| - String get helpShort;
|
| - void printHelp(Debugger debugger, List<String> args);
|
| - Future run(Debugger debugger, List<String> args);
|
| - List<String> complete(List<String> commandParts) {
|
| - return ["$name ${commandParts.join(' ')}"];
|
| -
|
| - }
|
| -}
|
| -
|
| -class AttachCommand extends Command {
|
| - final name = 'attach';
|
| - final helpShort = 'Attach to a running Dart VM';
|
| - void printHelp(Debugger debugger, List<String> args) {
|
| - debugger.cmdo.print('''
|
| ------ attach -----
|
| -
|
| -Attach to the Dart VM running at the indicated host:port. If no
|
| -host:port is provided, attach to the VM running on the default port.
|
| -
|
| -Usage:
|
| - attach
|
| - attach <host:port>
|
| -''');
|
| - }
|
| -
|
| - Future run(Debugger debugger, List<String> args) {
|
| - var cmdo = debugger.cmdo;
|
| - if (args.length > 2) {
|
| - cmdo.print('$name expects 0 or 1 arguments');
|
| - return new Future.value();
|
| - }
|
| - String hostPort = 'localhost:8181';
|
| - if (args.length > 1) {
|
| - hostPort = args[1];
|
| - }
|
| -
|
| - debugger.vm = new WebSocketVM(new WebSocketVMTarget('ws://${hostPort}/ws'));
|
| - return debugger.vm.load().then((vm) {
|
| - if (debugger.isolate == null) {
|
| - for (var isolate in vm.isolates) {
|
| - if (isolate.name == 'root') {
|
| - debugger.isolate = isolate;
|
| - }
|
| - }
|
| - }
|
| - });
|
| - }
|
| -}
|
| -
|
| -class CommandList {
|
| - List _commands = new List<Command>();
|
| -
|
| - void register(Command cmd) {
|
| - _commands.add(cmd);
|
| - }
|
| -
|
| - List<Command> match(String commandName, bool exactMatchWins) {
|
| - var matches = [];
|
| - for (var command in _commands) {
|
| - if (command.name.startsWith(commandName)) {
|
| - if (exactMatchWins && command.name == commandName) {
|
| - // Exact match
|
| - return [command];
|
| - } else {
|
| - matches.add(command);
|
| - }
|
| - }
|
| - }
|
| - return matches;
|
| - }
|
| -
|
| - List<String> complete(List<String> commandParts) {
|
| - var completions = new List<String>();
|
| - String prefix = commandParts[0];
|
| - for (var command in _commands) {
|
| - if (command.name.startsWith(prefix)) {
|
| - completions.addAll(command.complete(commandParts.sublist(1)));
|
| - }
|
| - }
|
| - return completions;
|
| - }
|
| -
|
| - void printHelp(Debugger debugger, List<String> args) {
|
| - var cmdo = debugger.cmdo;
|
| - if (args.length <= 1) {
|
| - cmdo.print("\nDebugger commands:\n");
|
| - for (var command in _commands) {
|
| - cmdo.print(' ${command.name.padRight(11)} ${command.helpShort}');
|
| - }
|
| - cmdo.print("For more information about a particular command, type:\n\n"
|
| - " help <command>\n");
|
| -
|
| - cmdo.print("Commands may be abbreviated: e.g. type 'h' for 'help.\n");
|
| - } else {
|
| - var commandName = args[1];
|
| - var matches =match(commandName, true);
|
| - if (matches.length == 0) {
|
| - cmdo.print("Command '$commandName' not recognized. "
|
| - "Try 'help' for a list of commands.");
|
| - } else {
|
| - for (var command in matches) {
|
| - command.printHelp(debugger, args);
|
| - }
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -class DetachCommand extends Command {
|
| - final name = 'detach';
|
| - final helpShort = 'Detach from a running Dart VM';
|
| - void printHelp(Debugger debugger, List<String> args) {
|
| - debugger.cmdo.print('''
|
| ------ detach -----
|
| -
|
| -Detach from the Dart VM.
|
| -
|
| -Usage:
|
| - detach
|
| -''');
|
| - }
|
| -
|
| - Future run(Debugger debugger, List<String> args) {
|
| - var cmdo = debugger.cmdo;
|
| - if (args.length > 1) {
|
| - cmdo.print('$name expects no arguments');
|
| - return new Future.value();
|
| - }
|
| - if (debugger.vm == null) {
|
| - cmdo.print('No VM is attached');
|
| - } else {
|
| - debugger.vm = null;
|
| - }
|
| - return new Future.value();
|
| - }
|
| -}
|
| -
|
| -class HelpCommand extends Command {
|
| - HelpCommand(this._commands);
|
| - final CommandList _commands;
|
| -
|
| - final name = 'help';
|
| - final helpShort = 'Show a list of debugger commands';
|
| - void printHelp(Debugger debugger, List<String> args) {
|
| - debugger.cmdo.print('''
|
| ------ help -----
|
| -
|
| -Show a list of debugger commands or get more information about a
|
| -particular command.
|
| -
|
| -Usage:
|
| - help
|
| - help <command>
|
| -''');
|
| - }
|
| -
|
| - Future run(Debugger debugger, List<String> args) {
|
| - _commands.printHelp(debugger, args);
|
| - return new Future.value();
|
| - }
|
| -
|
| - List<String> complete(List<String> commandParts) {
|
| - if (commandParts.isEmpty) {
|
| - return ['$name '];
|
| - }
|
| - return _commands.complete(commandParts).map((value) {
|
| - return '$name $value';
|
| - });
|
| - }
|
| -}
|
| -
|
| -class IsolateCommand extends Command {
|
| - final name = 'isolate';
|
| - final helpShort = 'Isolate control';
|
| - void printHelp(Debugger debugger, List<String> args) {
|
| - debugger.cmdo.print('''
|
| ------ isolate -----
|
| -
|
| -List all isolates.
|
| -
|
| -Usage:
|
| - isolate
|
| - isolate list
|
| -
|
| -Set current isolate.
|
| -
|
| -Usage:
|
| - isolate <id>
|
| -''');
|
| - }
|
| -
|
| - Future run(Debugger debugger, List<String> args) {
|
| - var cmdo = debugger.cmdo;
|
| - if (args.length == 1 ||
|
| - (args.length == 2 && args[1] == 'list')) {
|
| - return _listIsolates(debugger);
|
| - } else if (args.length == 2) {
|
| - cmdo.print('UNIMPLEMENTED');
|
| - return new Future.value();
|
| - } else {
|
| - if (args.length > 1) {
|
| - cmdo.print('Unrecognized isolate command');
|
| - printHelp(debugger, []);
|
| - return new Future.value();
|
| - }
|
| - }
|
| - }
|
| -
|
| - Future _listIsolates(Debugger debugger) {
|
| - var cmdo = debugger.cmdo;
|
| - if (debugger.vm == null) {
|
| - cmdo.print('No VM is attached');
|
| - return new Future.value();
|
| - }
|
| - return debugger.vm.reload().then((vm) {
|
| - // Sort the isolates by their indices.
|
| - var isolates = vm.isolates.toList();
|
| - isolates.sort((iso1, iso2) {
|
| - return (debugger.getIsolateIndex(iso1) -
|
| - debugger.getIsolateIndex(iso2));
|
| - });
|
| -
|
| - StringBuffer sb = new StringBuffer();
|
| - cmdo.print(' ID NAME STATE');
|
| - cmdo.print('-----------------------------------------------');
|
| - for (var isolate in isolates) {
|
| - if (isolate == debugger.isolate) {
|
| - sb.write('* ');
|
| - } else {
|
| - sb.write(' ');
|
| - }
|
| - sb.write(debugger.getIsolateIndex(isolate).toString().padRight(8));
|
| - sb.write(' ');
|
| - sb.write(isolate.name.padRight(12));
|
| - sb.write(' ');
|
| - if (isolate.pauseEvent != null) {
|
| - switch (isolate.pauseEvent.eventType) {
|
| - case 'IsolateCreated':
|
| - sb.write('paused at isolate start');
|
| - break;
|
| - case 'IsolateShutdown':
|
| - sb.write('paused at isolate exit');
|
| - break;
|
| - case 'IsolateInterrupted':
|
| - sb.write('paused');
|
| - break;
|
| - case 'BreakpointReached':
|
| - sb.write('paused by breakpoint');
|
| - break;
|
| - case 'ExceptionThrown':
|
| - sb.write('paused by exception');
|
| - break;
|
| - default:
|
| - sb.write('paused by unknown cause');
|
| - break;
|
| - }
|
| - } else if (isolate.running) {
|
| - sb.write('running');
|
| - } else if (isolate.idle) {
|
| - sb.write('idle');
|
| - } else if (isolate.loading) {
|
| - // TODO(turnidge): This is weird in a command line debugger.
|
| - sb.write('(not available)');
|
| - }
|
| - sb.write('\n');
|
| - }
|
| - cmdo.print(sb);
|
| - });
|
| - return new Future.value();
|
| - }
|
| -
|
| - List<String> complete(List<String> commandParts) {
|
| - if (commandParts.isEmpty) {
|
| - return ['$name ${commandParts.join(" ")}'];
|
| - } else {
|
| - var completions = _commands.complete(commandParts);
|
| - return completions.map((completion) {
|
| - return '$name $completion';
|
| - });
|
| - }
|
| - }
|
| -}
|
| -
|
| -class QuitCommand extends Command {
|
| - final name = 'quit';
|
| - final helpShort = 'Quit the debugger.';
|
| - void printHelp(Debugger debugger, List<String> args) {
|
| - debugger.cmdo.print('''
|
| ------ quit -----
|
| -
|
| -Quit the debugger.
|
| -
|
| -Usage:
|
| - quit
|
| -''');
|
| - }
|
| -
|
| - Future run(Debugger debugger, List<String> args) {
|
| - var cmdo = debugger.cmdo;
|
| - if (args.length > 1) {
|
| - cmdo.print("Unexpected arguments to $name command.");
|
| - return new Future.value();
|
| - }
|
| - return debugger.quit();
|
| - }
|
| -}
|
|
|