Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: runtime/observatory/lib/src/elements/debugger.dart

Issue 2521413002: Revert "Implement rewind: drop one or more frames from the debugger." (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | runtime/observatory/lib/src/service/object.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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:svg'; 8 import 'dart:svg';
9 import 'dart:html'; 9 import 'dart:html';
10 import 'dart:math'; 10 import 'dart:math';
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 return new Future.value(null); 202 return new Future.value(null);
203 } 203 }
204 if (debugger.currentFrame == null) { 204 if (debugger.currentFrame == null) {
205 debugger.console.print('No stack'); 205 debugger.console.print('No stack');
206 return new Future.value(null); 206 return new Future.value(null);
207 } 207 }
208 try { 208 try {
209 debugger.downFrame(count); 209 debugger.downFrame(count);
210 debugger.console.print('frame = ${debugger.currentFrame}'); 210 debugger.console.print('frame = ${debugger.currentFrame}');
211 } catch (e) { 211 } catch (e) {
212 debugger.console.print( 212 debugger.console.print('frame must be in range [${e.start},${e.end-1}]');
213 'frame must be in range [${e.start}..${e.end-1}]');
214 } 213 }
215 return new Future.value(null); 214 return new Future.value(null);
216 } 215 }
217 216
218 String helpShort = 'Move down one or more frames (hotkey: [Page Down])'; 217 String helpShort = 'Move down one or more frames (hotkey: [Page Down])';
219 218
220 String helpLong = 'Move down one or more frames.\n' 219 String helpLong = 'Move down one or more frames.\n'
221 '\n' 220 '\n'
222 'Hotkey: [Page Down]\n' 221 'Hotkey: [Page Down]\n'
223 '\n' 222 '\n'
(...skipping 13 matching lines...) Expand all
237 return new Future.value(null); 236 return new Future.value(null);
238 } 237 }
239 if (debugger.currentFrame == null) { 238 if (debugger.currentFrame == null) {
240 debugger.console.print('No stack'); 239 debugger.console.print('No stack');
241 return new Future.value(null); 240 return new Future.value(null);
242 } 241 }
243 try { 242 try {
244 debugger.upFrame(count); 243 debugger.upFrame(count);
245 debugger.console.print('frame = ${debugger.currentFrame}'); 244 debugger.console.print('frame = ${debugger.currentFrame}');
246 } on RangeError catch (e) { 245 } on RangeError catch (e) {
247 debugger.console.print( 246 debugger.console.print('frame must be in range [${e.start},${e.end-1}]');
248 'frame must be in range [${e.start}..${e.end-1}]');
249 } 247 }
250 return new Future.value(null); 248 return new Future.value(null);
251 } 249 }
252 250
253 String helpShort = 'Move up one or more frames (hotkey: [Page Up])'; 251 String helpShort = 'Move up one or more frames (hotkey: [Page Up])';
254 252
255 String helpLong = 'Move up one or more frames.\n' 253 String helpLong = 'Move up one or more frames.\n'
256 '\n' 254 '\n'
257 'Hotkey: [Page Up]\n' 255 'Hotkey: [Page Up]\n'
258 '\n' 256 '\n'
(...skipping 15 matching lines...) Expand all
274 return new Future.value(null); 272 return new Future.value(null);
275 } 273 }
276 if (debugger.currentFrame == null) { 274 if (debugger.currentFrame == null) {
277 debugger.console.print('No stack'); 275 debugger.console.print('No stack');
278 return new Future.value(null); 276 return new Future.value(null);
279 } 277 }
280 try { 278 try {
281 debugger.currentFrame = frame; 279 debugger.currentFrame = frame;
282 debugger.console.print('frame = ${debugger.currentFrame}'); 280 debugger.console.print('frame = ${debugger.currentFrame}');
283 } on RangeError catch (e) { 281 } on RangeError catch (e) {
284 debugger.console.print( 282 debugger.console.print('frame must be in range [${e.start},${e.end-1}]');
285 'frame must be in range [${e.start}..${e.end-1}]');
286 } 283 }
287 return new Future.value(null); 284 return new Future.value(null);
288 } 285 }
289 286
290 String helpShort = 'Set the current frame'; 287 String helpShort = 'Set the current frame';
291 288
292 String helpLong = 'Set the current frame.\n' 289 String helpLong = 'Set the current frame.\n'
293 '\n' 290 '\n'
294 'Syntax: frame <number>\n' 291 'Syntax: frame <number>\n'
295 ' f <count>\n'; 292 ' f <count>\n';
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 396
400 String helpLong = 397 String helpLong =
401 'Continue running the isolate until it reaches the next source ' 398 'Continue running the isolate until it reaches the next source '
402 'location.\n' 399 'location.\n'
403 '\n' 400 '\n'
404 'Hotkey: [F10]\n' 401 'Hotkey: [F10]\n'
405 '\n' 402 '\n'
406 'Syntax: step\n'; 403 'Syntax: step\n';
407 } 404 }
408 405
409 class RewindCommand extends DebuggerCommand {
410 RewindCommand(Debugger debugger) : super(debugger, 'rewind', []);
411
412 Future run(List<String> args) async {
413 try {
414 int count = 1;
415 if (args.length == 1) {
416 count = int.parse(args[0]);
417 } else if (args.length > 1) {
418 debugger.console.print('rewind expects 0 or 1 argument');
419 return;
420 } else if (count < 1 || count > debugger.stackDepth) {
421 debugger.console.print(
422 'frame must be in range [1..${debugger.stackDepth - 1}]');
423 return;
424 }
425 await debugger.rewind(count);
426 } on S.ServerRpcException catch(e) {
427 if (e.code == S.ServerRpcException.kCannotResume) {
428 debugger.console.printRed(e.data['details']);
429 } else {
430 rethrow;
431 }
432 }
433 }
434
435 String helpShort = 'Rewind the stack to a previous frame';
436
437 String helpLong =
438 'Rewind the stack to a previous frame.\n'
439 '\n'
440 'Syntax: rewind\n'
441 ' rewind <count>\n';
442 }
443
444 class ReloadCommand extends DebuggerCommand {
445 ReloadCommand(Debugger debugger) : super(debugger, 'reload', []);
446
447 Future run(List<String> args) async {
448 try {
449 int count = 1;
450 if (args.length > 0) {
451 debugger.console.print('reload expects no arguments');
452 return;
453 }
454 await debugger.isolate.reloadSources();
455 debugger.console.print('reload complete');
456 await debugger.refreshStack();
457 } on S.ServerRpcException catch(e) {
458 if (e.code == S.ServerRpcException.kIsolateReloadBarred ||
459 e.code == S.ServerRpcException.kIsolateReloadFailed ||
460 e.code == S.ServerRpcException.kIsolateIsReloading) {
461 debugger.console.printRed(e.data['details']);
462 } else {
463 rethrow;
464 }
465 }
466 }
467
468 String helpShort = 'Reload the sources for the current isolate';
469
470 String helpLong =
471 'Reload the sources for the current isolate.\n'
472 '\n'
473 'Syntax: reload\n';
474 }
475
476 class ClsCommand extends DebuggerCommand { 406 class ClsCommand extends DebuggerCommand {
477 ClsCommand(Debugger debugger) : super(debugger, 'cls', []) {} 407 ClsCommand(Debugger debugger) : super(debugger, 'cls', []) {}
478 408
479 Future run(List<String> args) { 409 Future run(List<String> args) {
480 debugger.console.clear(); 410 debugger.console.clear();
481 debugger.console.newline(); 411 debugger.console.newline();
482 return new Future.value(null); 412 return new Future.value(null);
483 } 413 }
484 414
485 String helpShort = 'Clear the console'; 415 String helpShort = 'Clear the console';
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 debugger.console.print('Unable to set breakpoint at ${loc}'); 656 debugger.console.print('Unable to set breakpoint at ${loc}');
727 } else { 657 } else {
728 rethrow; 658 rethrow;
729 } 659 }
730 } 660 }
731 } else { 661 } else {
732 assert(loc.script != null); 662 assert(loc.script != null);
733 var script = loc.script; 663 var script = loc.script;
734 await script.load(); 664 await script.load();
735 if (loc.line < 1 || loc.line > script.lines.length) { 665 if (loc.line < 1 || loc.line > script.lines.length) {
736 debugger.console.print( 666 debugger.console
737 'line number must be in range [1..${script.lines.length}]'); 667 .print('line number must be in range [1,${script.lines.length}]');
738 return; 668 return;
739 } 669 }
740 try { 670 try {
741 await debugger.isolate.addBreakpoint(script, loc.line, loc.col); 671 await debugger.isolate.addBreakpoint(script, loc.line, loc.col);
742 } on S.ServerRpcException catch (e) { 672 } on S.ServerRpcException catch (e) {
743 if (e.code == S.ServerRpcException.kCannotAddBreakpoint) { 673 if (e.code == S.ServerRpcException.kCannotAddBreakpoint) {
744 debugger.console.print('Unable to set breakpoint at ${loc}'); 674 debugger.console.print('Unable to set breakpoint at ${loc}');
745 } else { 675 } else {
746 rethrow; 676 rethrow;
747 } 677 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 } 737 }
808 if (loc.function != null) { 738 if (loc.function != null) {
809 debugger.console.print('Ignoring breakpoint at $loc: ' 739 debugger.console.print('Ignoring breakpoint at $loc: '
810 'Clearing function breakpoints not yet implemented'); 740 'Clearing function breakpoints not yet implemented');
811 return; 741 return;
812 } 742 }
813 743
814 var script = loc.script; 744 var script = loc.script;
815 if (loc.line < 1 || loc.line > script.lines.length) { 745 if (loc.line < 1 || loc.line > script.lines.length) {
816 debugger.console 746 debugger.console
817 .print('line number must be in range [1..${script.lines.length}]'); 747 .print('line number must be in range [1,${script.lines.length}]');
818 return; 748 return;
819 } 749 }
820 var lineInfo = script.getLine(loc.line); 750 var lineInfo = script.getLine(loc.line);
821 var bpts = lineInfo.breakpoints; 751 var bpts = lineInfo.breakpoints;
822 var foundBreakpoint = false; 752 var foundBreakpoint = false;
823 if (bpts != null) { 753 if (bpts != null) {
824 var bptList = bpts.toList(); 754 var bptList = bpts.toList();
825 for (var bpt in bptList) { 755 for (var bpt in bptList) {
826 if (loc.col == null || 756 if (loc.col == null ||
827 loc.col == script.tokenToCol(bpt.location.tokenPos)) { 757 loc.col == script.tokenToCol(bpt.location.tokenPos)) {
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 String helpLong = 'Show current frame.\n' 892 String helpLong = 'Show current frame.\n'
963 '\n' 893 '\n'
964 'Syntax: info frame\n'; 894 'Syntax: info frame\n';
965 } 895 }
966 896
967 class IsolateCommand extends DebuggerCommand { 897 class IsolateCommand extends DebuggerCommand {
968 IsolateCommand(Debugger debugger) 898 IsolateCommand(Debugger debugger)
969 : super(debugger, 'isolate', [ 899 : super(debugger, 'isolate', [
970 new IsolateListCommand(debugger), 900 new IsolateListCommand(debugger),
971 new IsolateNameCommand(debugger), 901 new IsolateNameCommand(debugger),
902 new IsolateReloadCommand(debugger),
972 ]) { 903 ]) {
973 alias = 'i'; 904 alias = 'i';
974 } 905 }
975 906
976 Future run(List<String> args) { 907 Future run(List<String> args) {
977 if (args.length != 1) { 908 if (args.length != 1) {
978 debugger.console.print('isolate expects one argument'); 909 debugger.console.print('isolate expects one argument');
979 return new Future.value(null); 910 return new Future.value(null);
980 } 911 }
981 var arg = args[0].trim(); 912 var arg = args[0].trim();
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 return debugger.isolate.setName(args[0]); 1035 return debugger.isolate.setName(args[0]);
1105 } 1036 }
1106 1037
1107 String helpShort = 'Rename the current isolate'; 1038 String helpShort = 'Rename the current isolate';
1108 1039
1109 String helpLong = 'Rename the current isolate.\n' 1040 String helpLong = 'Rename the current isolate.\n'
1110 '\n' 1041 '\n'
1111 'Syntax: isolate name <name>\n'; 1042 'Syntax: isolate name <name>\n';
1112 } 1043 }
1113 1044
1045 class IsolateReloadCommand extends DebuggerCommand {
1046 IsolateReloadCommand(Debugger debugger) : super(debugger, 'reload', []);
1047
1048 Future run(List<String> args) async {
1049 if (debugger.isolate == null) {
1050 debugger.console.print('There is no current vm');
1051 return;
1052 }
1053
1054 await debugger.isolate.reloadSources();
1055
1056 debugger.console.print('Isolate reloading....');
1057 }
1058
1059 String helpShort = 'Reload the sources for the current isolate.';
1060
1061 String helpLong = 'Reload the sources for the current isolate.\n'
1062 '\n'
1063 'Syntax: reload\n';
1064 }
1065
1114 class InfoCommand extends DebuggerCommand { 1066 class InfoCommand extends DebuggerCommand {
1115 InfoCommand(Debugger debugger) 1067 InfoCommand(Debugger debugger)
1116 : super(debugger, 'info', [ 1068 : super(debugger, 'info', [
1117 new InfoBreakpointsCommand(debugger), 1069 new InfoBreakpointsCommand(debugger),
1118 new InfoFrameCommand(debugger) 1070 new InfoFrameCommand(debugger)
1119 ]); 1071 ]);
1120 1072
1121 Future run(List<String> args) { 1073 Future run(List<String> args) {
1122 debugger.console.print("'info' expects a subcommand (see 'help info')"); 1074 debugger.console.print("'info' expects a subcommand (see 'help info')");
1123 return new Future.value(null); 1075 return new Future.value(null);
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 new DeleteCommand(this), 1364 new DeleteCommand(this),
1413 new DownCommand(this), 1365 new DownCommand(this),
1414 new FinishCommand(this), 1366 new FinishCommand(this),
1415 new FrameCommand(this), 1367 new FrameCommand(this),
1416 new HelpCommand(this), 1368 new HelpCommand(this),
1417 new InfoCommand(this), 1369 new InfoCommand(this),
1418 new IsolateCommand(this), 1370 new IsolateCommand(this),
1419 new LogCommand(this), 1371 new LogCommand(this),
1420 new PauseCommand(this), 1372 new PauseCommand(this),
1421 new PrintCommand(this), 1373 new PrintCommand(this),
1422 new ReloadCommand(this),
1423 new RefreshCommand(this), 1374 new RefreshCommand(this),
1424 new RewindCommand(this),
1425 new SetCommand(this), 1375 new SetCommand(this),
1426 new SmartNextCommand(this), 1376 new SmartNextCommand(this),
1427 new StepCommand(this), 1377 new StepCommand(this),
1428 new SyncNextCommand(this), 1378 new SyncNextCommand(this),
1429 new UpCommand(this), 1379 new UpCommand(this),
1430 new VmCommand(this), 1380 new VmCommand(this),
1431 ], _history); 1381 ], _history);
1432 _consolePrinter = new _ConsoleStreamPrinter(this); 1382 _consolePrinter = new _ConsoleStreamPrinter(this);
1433 } 1383 }
1434 1384
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
1922 if (event is M.PauseExitEvent) { 1872 if (event is M.PauseExitEvent) {
1923 console.print("Type 'continue' [F7] to exit the isolate"); 1873 console.print("Type 'continue' [F7] to exit the isolate");
1924 return new Future.value(null); 1874 return new Future.value(null);
1925 } 1875 }
1926 return isolate.stepInto(); 1876 return isolate.stepInto();
1927 } else { 1877 } else {
1928 console.print('The program is already running'); 1878 console.print('The program is already running');
1929 return new Future.value(null); 1879 return new Future.value(null);
1930 } 1880 }
1931 } 1881 }
1932
1933 Future rewind(int count) {
1934 if (isolatePaused()) {
1935 var event = isolate.pauseEvent;
1936 if (event is M.PauseExitEvent) {
1937 console.print("Type 'continue' [F7] to exit the isolate");
1938 return new Future.value(null);
1939 }
1940 return isolate.rewind(count);
1941 } else {
1942 console.print('The program must be paused');
1943 return new Future.value(null);
1944 }
1945 }
1946 } 1882 }
1947 1883
1948 class DebuggerPageElement extends HtmlElement implements Renderable { 1884 class DebuggerPageElement extends HtmlElement implements Renderable {
1949 static const tag = 1885 static const tag =
1950 const Tag<DebuggerPageElement>('debugger-page', dependencies: const [ 1886 const Tag<DebuggerPageElement>('debugger-page', dependencies: const [
1951 NavTopMenuElement.tag, 1887 NavTopMenuElement.tag,
1952 NavVMMenuElement.tag, 1888 NavVMMenuElement.tag,
1953 NavIsolateMenuElement.tag, 1889 NavIsolateMenuElement.tag,
1954 NavNotifyElement.tag, 1890 NavNotifyElement.tag,
1955 ]); 1891 ]);
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after
2570 ..classes = ['frameSummary'] 2506 ..classes = ['frameSummary']
2571 ..children = content 2507 ..children = content
2572 ]; 2508 ];
2573 } 2509 }
2574 2510
2575 String makeExpandKey(String key) { 2511 String makeExpandKey(String key) {
2576 return '${_frame.function.qualifiedName}/${key}'; 2512 return '${_frame.function.qualifiedName}/${key}';
2577 } 2513 }
2578 2514
2579 bool matchFrame(S.Frame newFrame) { 2515 bool matchFrame(S.Frame newFrame) {
2580 return (newFrame.function.id == _frame.function.id && 2516 return newFrame.function.id == _frame.function.id;
2581 newFrame.location.script.id ==
2582 frame.location.script.id);
2583 } 2517 }
2584 2518
2585 void updateFrame(S.Frame newFrame) { 2519 void updateFrame(S.Frame newFrame) {
2586 assert(matchFrame(newFrame)); 2520 assert(matchFrame(newFrame));
2587 _frame = newFrame; 2521 _frame = newFrame;
2588 } 2522 }
2589 2523
2590 S.Script get script => _frame.location.script; 2524 S.Script get script => _frame.location.script;
2591 2525
2592 int _varsTop(varsDiv) { 2526 int _varsTop(varsDiv) {
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after
3256 ..setAttribute('height', '24') 3190 ..setAttribute('height', '24')
3257 ..children = [ 3191 ..children = [
3258 new PathElement() 3192 new PathElement()
3259 ..setAttribute( 3193 ..setAttribute(
3260 'd', 3194 'd',
3261 'M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 ' 3195 'M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 '
3262 '10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 ' 3196 '10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 '
3263 '0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 ' 3197 '0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 '
3264 '9h2V7h-2v2z') 3198 '9h2V7h-2v2z')
3265 ]; 3199 ];
OLDNEW
« no previous file with comments | « no previous file | runtime/observatory/lib/src/service/object.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698