OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library debugger_page_element; | 5 library debugger_page_element; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:html'; | 8 import 'dart:html'; |
| 9 import 'dart:math'; |
9 import 'observatory_element.dart'; | 10 import 'observatory_element.dart'; |
10 import 'package:observatory/app.dart'; | 11 import 'package:observatory/app.dart'; |
11 import 'package:observatory/cli.dart'; | 12 import 'package:observatory/cli.dart'; |
12 import 'package:observatory/debugger.dart'; | 13 import 'package:observatory/debugger.dart'; |
13 import 'package:observatory/service.dart'; | 14 import 'package:observatory/service.dart'; |
14 import 'package:logging/logging.dart'; | 15 import 'package:logging/logging.dart'; |
15 import 'package:polymer/polymer.dart'; | 16 import 'package:polymer/polymer.dart'; |
16 | 17 |
17 // TODO(turnidge): Move Debugger, DebuggerCommand to debugger library. | 18 // TODO(turnidge): Move Debugger, DebuggerCommand to debugger library. |
18 abstract class DebuggerCommand extends Command { | 19 abstract class DebuggerCommand extends Command { |
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 for (var isolate in debugger.vm.isolates) { | 957 for (var isolate in debugger.vm.isolates) { |
957 if (isolate.name.startsWith(args[0])) { | 958 if (isolate.name.startsWith(args[0])) { |
958 result.add('${isolate.name} '); | 959 result.add('${isolate.name} '); |
959 } | 960 } |
960 } | 961 } |
961 return new Future.value(result); | 962 return new Future.value(result); |
962 } | 963 } |
963 String helpShort = 'Switch the current isolate'; | 964 String helpShort = 'Switch the current isolate'; |
964 | 965 |
965 String helpLong = | 966 String helpLong = |
966 'Switch the current isolate.\n' | 967 'Switch, list, or rename isolates.\n' |
967 '\n' | 968 '\n' |
968 'Syntax: isolate <number>\n' | 969 'Syntax: isolate <number>\n' |
969 ' isolate <name>\n'; | 970 ' isolate <name>\n'; |
970 } | 971 } |
971 | 972 |
972 String _isolateRunState(Isolate isolate) { | 973 String _isolateRunState(Isolate isolate) { |
973 if (isolate.paused) { | 974 if (isolate.paused) { |
974 return 'paused'; | 975 return 'paused'; |
975 } else if (isolate.running) { | 976 } else if (isolate.running) { |
976 return 'running'; | 977 return 'running'; |
(...skipping 16 matching lines...) Expand all Loading... |
993 | 994 |
994 // Refresh all isolates first. | 995 // Refresh all isolates first. |
995 var pending = []; | 996 var pending = []; |
996 for (var isolate in debugger.vm.isolates) { | 997 for (var isolate in debugger.vm.isolates) { |
997 pending.add(isolate.reload()); | 998 pending.add(isolate.reload()); |
998 } | 999 } |
999 await Future.wait(pending); | 1000 await Future.wait(pending); |
1000 | 1001 |
1001 const maxIdLen = 9; | 1002 const maxIdLen = 9; |
1002 const maxRunStateLen = 7; | 1003 const maxRunStateLen = 7; |
1003 var maxNameLen = 0; | 1004 var maxNameLen = 'NAME'.length; |
1004 for (var isolate in debugger.vm.isolates) { | 1005 for (var isolate in debugger.vm.isolates) { |
1005 if (isolate.name.length > maxNameLen) { | 1006 maxNameLen = max(maxNameLen, isolate.name.length); |
1006 maxNameLen = isolate.name.length; | |
1007 } | |
1008 } | 1007 } |
1009 | 1008 |
1010 debugger.console.print("${'ID'.padLeft(maxIdLen, ' ')} " | 1009 debugger.console.print("${'ID'.padLeft(maxIdLen, ' ')} " |
1011 "${'ORIGIN'.padLeft(maxIdLen, ' ')} " | 1010 "${'ORIGIN'.padLeft(maxIdLen, ' ')} " |
1012 "${'NAME'.padRight(maxNameLen, ' ')} " | 1011 "${'NAME'.padRight(maxNameLen, ' ')} " |
1013 "${'STATE'.padRight(maxRunStateLen, ' ')} " | 1012 "${'STATE'.padRight(maxRunStateLen, ' ')} " |
1014 "CURRENT"); | 1013 "CURRENT"); |
1015 for (var isolate in debugger.vm.isolates) { | 1014 for (var isolate in debugger.vm.isolates) { |
1016 String current = (isolate == debugger.isolate ? '*' : ''); | 1015 String current = (isolate == debugger.isolate ? '*' : ''); |
1017 debugger.console.print( | 1016 debugger.console.print( |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1118 } | 1117 } |
1119 | 1118 |
1120 String helpShort = 'Refresh debugging information of various sorts'; | 1119 String helpShort = 'Refresh debugging information of various sorts'; |
1121 | 1120 |
1122 String helpLong = | 1121 String helpLong = |
1123 'Refresh debugging information of various sorts.\n' | 1122 'Refresh debugging information of various sorts.\n' |
1124 '\n' | 1123 '\n' |
1125 'Syntax: refresh <subcommand>\n'; | 1124 'Syntax: refresh <subcommand>\n'; |
1126 } | 1125 } |
1127 | 1126 |
| 1127 class VmListCommand extends DebuggerCommand { |
| 1128 VmListCommand(Debugger debugger) : super(debugger, 'list', []); |
| 1129 |
| 1130 Future run(List<String> args) async { |
| 1131 if (args.length > 0) { |
| 1132 debugger.console.print('vm list expects no arguments'); |
| 1133 return; |
| 1134 } |
| 1135 if (debugger.vm == null) { |
| 1136 debugger.console.print("No connected VMs"); |
| 1137 return; |
| 1138 } |
| 1139 // TODO(turnidge): Right now there is only one vm listed. |
| 1140 var vmList = [debugger.vm]; |
| 1141 |
| 1142 var maxAddrLen = 'ADDRESS'.length; |
| 1143 var maxNameLen = 'NAME'.length; |
| 1144 |
| 1145 for (var vm in vmList) { |
| 1146 maxAddrLen = max(maxAddrLen, vm.target.networkAddress.length); |
| 1147 maxNameLen = max(maxNameLen, vm.name.length); |
| 1148 } |
| 1149 |
| 1150 debugger.console.print("${'ADDRESS'.padRight(maxAddrLen, ' ')} " |
| 1151 "${'NAME'.padRight(maxNameLen, ' ')} " |
| 1152 "CURRENT"); |
| 1153 for (var vm in vmList) { |
| 1154 String current = (vm == debugger.vm ? '*' : ''); |
| 1155 debugger.console.print( |
| 1156 "${vm.target.networkAddress.padRight(maxAddrLen, ' ')} " |
| 1157 "${vm.name.padRight(maxNameLen, ' ')} " |
| 1158 "${current}"); |
| 1159 } |
| 1160 } |
| 1161 |
| 1162 String helpShort = 'List all connected Dart virtual machines'; |
| 1163 |
| 1164 String helpLong = |
| 1165 'List all connected Dart virtual machines..\n' |
| 1166 '\n' |
| 1167 'Syntax: vm list\n'; |
| 1168 } |
| 1169 |
| 1170 class VmNameCommand extends DebuggerCommand { |
| 1171 VmNameCommand(Debugger debugger) : super(debugger, 'name', []); |
| 1172 |
| 1173 Future run(List<String> args) async { |
| 1174 if (args.length != 1) { |
| 1175 debugger.console.print('vm name expects one argument'); |
| 1176 return; |
| 1177 } |
| 1178 if (debugger.vm == null) { |
| 1179 debugger.console.print('There is no current vm'); |
| 1180 return; |
| 1181 } |
| 1182 await debugger.vm.setName(args[0]); |
| 1183 } |
| 1184 |
| 1185 String helpShort = 'Rename the current Dart virtual machine'; |
| 1186 |
| 1187 String helpLong = |
| 1188 'Rename the current Dart virtual machine.\n' |
| 1189 '\n' |
| 1190 'Syntax: vm name <name>\n'; |
| 1191 } |
| 1192 |
1128 class VmRestartCommand extends DebuggerCommand { | 1193 class VmRestartCommand extends DebuggerCommand { |
1129 VmRestartCommand(Debugger debugger) : super(debugger, 'restart', []); | 1194 VmRestartCommand(Debugger debugger) : super(debugger, 'restart', []); |
1130 | 1195 |
1131 Future handleModalInput(String line) async { | 1196 Future handleModalInput(String line) async { |
1132 if (line == 'yes') { | 1197 if (line == 'yes') { |
1133 debugger.console.printRed('Restarting VM...'); | 1198 debugger.console.printRed('Restarting VM...'); |
1134 await debugger.vm.restart(); | 1199 await debugger.vm.restart(); |
1135 debugger.input.exitMode(); | 1200 debugger.input.exitMode(); |
1136 } else if (line == 'no') { | 1201 } else if (line == 'no') { |
1137 debugger.console.printRed('VM restart canceled.'); | 1202 debugger.console.printRed('VM restart canceled.'); |
(...skipping 10 matching lines...) Expand all Loading... |
1148 String helpShort = 'Restart a Dart virtual machine'; | 1213 String helpShort = 'Restart a Dart virtual machine'; |
1149 | 1214 |
1150 String helpLong = | 1215 String helpLong = |
1151 'Restart a Dart virtual machine.\n' | 1216 'Restart a Dart virtual machine.\n' |
1152 '\n' | 1217 '\n' |
1153 'Syntax: vm restart\n'; | 1218 'Syntax: vm restart\n'; |
1154 } | 1219 } |
1155 | 1220 |
1156 class VmCommand extends DebuggerCommand { | 1221 class VmCommand extends DebuggerCommand { |
1157 VmCommand(Debugger debugger) : super(debugger, 'vm', [ | 1222 VmCommand(Debugger debugger) : super(debugger, 'vm', [ |
| 1223 new VmListCommand(debugger), |
| 1224 new VmNameCommand(debugger), |
1158 new VmRestartCommand(debugger), | 1225 new VmRestartCommand(debugger), |
1159 ]); | 1226 ]); |
1160 | 1227 |
1161 Future run(List<String> args) async { | 1228 Future run(List<String> args) async { |
1162 debugger.console.print("'vm' expects a subcommand (see 'help vm')"); | 1229 debugger.console.print("'vm' expects a subcommand (see 'help vm')"); |
1163 } | 1230 } |
1164 | 1231 |
1165 String helpShort = 'Manage a Dart virtual machine'; | 1232 String helpShort = 'Manage a Dart virtual machine'; |
1166 | 1233 |
1167 String helpLong = | 1234 String helpLong = |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1510 console.print( | 1577 console.print( |
1511 'Breakpoint ${bpId} ${verb} at ${locString}'); | 1578 'Breakpoint ${bpId} ${verb} at ${locString}'); |
1512 } else { | 1579 } else { |
1513 console.print( | 1580 console.print( |
1514 'Future breakpoint ${bpId} ${verb} at ${locString}'); | 1581 'Future breakpoint ${bpId} ${verb} at ${locString}'); |
1515 } | 1582 } |
1516 } | 1583 } |
1517 | 1584 |
1518 void onEvent(ServiceEvent event) { | 1585 void onEvent(ServiceEvent event) { |
1519 switch(event.kind) { | 1586 switch(event.kind) { |
| 1587 case ServiceEvent.kVMUpdate: |
| 1588 var vm = event.owner; |
| 1589 console.print("VM ${vm.target.networkAddress} renamed to '${vm.name}'"); |
| 1590 break; |
| 1591 |
1520 case ServiceEvent.kIsolateStart: | 1592 case ServiceEvent.kIsolateStart: |
1521 { | 1593 { |
1522 var iso = event.owner; | 1594 var iso = event.owner; |
1523 console.print( | 1595 console.print( |
1524 "Isolate ${iso.number} '${iso.name}' has been created"); | 1596 "Isolate ${iso.number} '${iso.name}' has been created"); |
1525 if (isolate == null) { | 1597 if (isolate == null) { |
1526 console.print("Switching to isolate ${iso.number} '${iso.name}'"); | 1598 console.print("Switching to isolate ${iso.number} '${iso.name}'"); |
1527 isolate = iso; | 1599 isolate = iso; |
1528 } | 1600 } |
1529 } | 1601 } |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1802 isolateChanged(oldValue) { | 1874 isolateChanged(oldValue) { |
1803 debugger.updateIsolate(isolate); | 1875 debugger.updateIsolate(isolate); |
1804 } | 1876 } |
1805 ObservatoryDebugger debugger = new ObservatoryDebugger(); | 1877 ObservatoryDebugger debugger = new ObservatoryDebugger(); |
1806 | 1878 |
1807 DebuggerPageElement.created() : super.created() { | 1879 DebuggerPageElement.created() : super.created() { |
1808 debugger.page = this; | 1880 debugger.page = this; |
1809 } | 1881 } |
1810 | 1882 |
1811 StreamSubscription _resizeSubscription; | 1883 StreamSubscription _resizeSubscription; |
| 1884 Future<StreamSubscription> _vmSubscriptionFuture; |
1812 Future<StreamSubscription> _isolateSubscriptionFuture; | 1885 Future<StreamSubscription> _isolateSubscriptionFuture; |
1813 Future<StreamSubscription> _debugSubscriptionFuture; | 1886 Future<StreamSubscription> _debugSubscriptionFuture; |
1814 Future<StreamSubscription> _stdoutSubscriptionFuture; | 1887 Future<StreamSubscription> _stdoutSubscriptionFuture; |
1815 Future<StreamSubscription> _stderrSubscriptionFuture; | 1888 Future<StreamSubscription> _stderrSubscriptionFuture; |
1816 Future<StreamSubscription> _logSubscriptionFuture; | 1889 Future<StreamSubscription> _logSubscriptionFuture; |
1817 | 1890 |
1818 @override | 1891 @override |
1819 void attached() { | 1892 void attached() { |
1820 super.attached(); | 1893 super.attached(); |
1821 _onResize(null); | 1894 _onResize(null); |
1822 | 1895 |
1823 // Wire the debugger object to the stack, console, and command line. | 1896 // Wire the debugger object to the stack, console, and command line. |
1824 var stackElement = $['stackElement']; | 1897 var stackElement = $['stackElement']; |
1825 debugger.stackElement = stackElement; | 1898 debugger.stackElement = stackElement; |
1826 stackElement.debugger = debugger; | 1899 stackElement.debugger = debugger; |
1827 debugger.console = $['console']; | 1900 debugger.console = $['console']; |
1828 debugger.input = $['commandline']; | 1901 debugger.input = $['commandline']; |
1829 debugger.input.debugger = debugger; | 1902 debugger.input.debugger = debugger; |
1830 debugger.init(); | 1903 debugger.init(); |
1831 | 1904 |
1832 _resizeSubscription = window.onResize.listen(_onResize); | 1905 _resizeSubscription = window.onResize.listen(_onResize); |
| 1906 _vmSubscriptionFuture = |
| 1907 app.vm.listenEventStream(VM.kVMStream, debugger.onEvent); |
1833 _isolateSubscriptionFuture = | 1908 _isolateSubscriptionFuture = |
1834 app.vm.listenEventStream(VM.kIsolateStream, debugger.onEvent); | 1909 app.vm.listenEventStream(VM.kIsolateStream, debugger.onEvent); |
1835 _debugSubscriptionFuture = | 1910 _debugSubscriptionFuture = |
1836 app.vm.listenEventStream(VM.kDebugStream, debugger.onEvent); | 1911 app.vm.listenEventStream(VM.kDebugStream, debugger.onEvent); |
1837 _stdoutSubscriptionFuture = | 1912 _stdoutSubscriptionFuture = |
1838 app.vm.listenEventStream(VM.kStdoutStream, debugger.onStdout); | 1913 app.vm.listenEventStream(VM.kStdoutStream, debugger.onStdout); |
1839 if (_stdoutSubscriptionFuture != null) { | 1914 if (_stdoutSubscriptionFuture != null) { |
1840 // TODO(turnidge): How do we want to handle this in general? | 1915 // TODO(turnidge): How do we want to handle this in general? |
1841 _stdoutSubscriptionFuture.catchError((e, st) { | 1916 _stdoutSubscriptionFuture.catchError((e, st) { |
1842 Logger.root.info('Failed to subscribe to stdout: $e\n$st\n'); | 1917 Logger.root.info('Failed to subscribe to stdout: $e\n$st\n'); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1885 int available = windowHeight - fixedHeight; | 1960 int available = windowHeight - fixedHeight; |
1886 int stackHeight = available ~/ 1.6; | 1961 int stackHeight = available ~/ 1.6; |
1887 stackDiv.style.setProperty('height', '${stackHeight}px'); | 1962 stackDiv.style.setProperty('height', '${stackHeight}px'); |
1888 } | 1963 } |
1889 | 1964 |
1890 @override | 1965 @override |
1891 void detached() { | 1966 void detached() { |
1892 debugger.isolate = null; | 1967 debugger.isolate = null; |
1893 _resizeSubscription.cancel(); | 1968 _resizeSubscription.cancel(); |
1894 _resizeSubscription = null; | 1969 _resizeSubscription = null; |
| 1970 cancelFutureSubscription(_vmSubscriptionFuture); |
| 1971 _vmSubscriptionFuture = null; |
1895 cancelFutureSubscription(_isolateSubscriptionFuture); | 1972 cancelFutureSubscription(_isolateSubscriptionFuture); |
1896 _isolateSubscriptionFuture = null; | 1973 _isolateSubscriptionFuture = null; |
1897 cancelFutureSubscription(_debugSubscriptionFuture); | 1974 cancelFutureSubscription(_debugSubscriptionFuture); |
1898 _debugSubscriptionFuture = null; | 1975 _debugSubscriptionFuture = null; |
1899 cancelFutureSubscription(_stdoutSubscriptionFuture); | 1976 cancelFutureSubscription(_stdoutSubscriptionFuture); |
1900 _stdoutSubscriptionFuture = null; | 1977 _stdoutSubscriptionFuture = null; |
1901 cancelFutureSubscription(_stderrSubscriptionFuture); | 1978 cancelFutureSubscription(_stderrSubscriptionFuture); |
1902 _stderrSubscriptionFuture = null; | 1979 _stderrSubscriptionFuture = null; |
1903 cancelFutureSubscription(_logSubscriptionFuture); | 1980 cancelFutureSubscription(_logSubscriptionFuture); |
1904 _logSubscriptionFuture = null; | 1981 _logSubscriptionFuture = null; |
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2492 } | 2569 } |
2493 }); | 2570 }); |
2494 } | 2571 } |
2495 | 2572 |
2496 void focus() { | 2573 void focus() { |
2497 $['textBox'].focus(); | 2574 $['textBox'].focus(); |
2498 } | 2575 } |
2499 | 2576 |
2500 DebuggerInputElement.created() : super.created(); | 2577 DebuggerInputElement.created() : super.created(); |
2501 } | 2578 } |
OLD | NEW |