Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 110 const kNoFrame = -1; | 110 const kNoFrame = -1; |
| 111 Debug.State = { | 111 Debug.State = { |
| 112 currentFrame: kNoFrame, | 112 currentFrame: kNoFrame, |
| 113 displaySourceStartLine: -1, | 113 displaySourceStartLine: -1, |
| 114 displaySourceEndLine: -1, | 114 displaySourceEndLine: -1, |
| 115 currentSourceLine: -1 | 115 currentSourceLine: -1 |
| 116 } | 116 } |
| 117 var trace_compile = false; // Tracing all compile events? | 117 var trace_compile = false; // Tracing all compile events? |
| 118 var trace_debug_json = false; // Tracing all debug json packets? | 118 var trace_debug_json = false; // Tracing all debug json packets? |
| 119 var last_cmd_line = ''; | 119 var last_cmd_line = ''; |
| 120 //var lol_is_enabled; // Set to true in d8.cc if LIVE_OBJECT_LIST is defined. | |
| 121 var lol_next_dump_index = 0; | |
| 122 const kDefaultLolLinesToPrintAtATime = 10; | |
| 123 const kMaxLolLinesToPrintAtATime = 1000; | |
| 120 var repeat_cmd_line = ''; | 124 var repeat_cmd_line = ''; |
| 121 var is_running = true; | 125 var is_running = true; |
| 122 | 126 |
| 123 // Copied from debug-delay.js. This is needed below: | 127 // Copied from debug-delay.js. This is needed below: |
| 124 function ScriptTypeFlag(type) { | 128 function ScriptTypeFlag(type) { |
| 125 return (1 << type); | 129 return (1 << type); |
| 126 } | 130 } |
| 127 | 131 |
| 128 | 132 |
| 129 // Process a debugger JSON message into a display text and a running status. | 133 // Process a debugger JSON message into a display text and a running status. |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 488 this.traceCommand_(args); | 492 this.traceCommand_(args); |
| 489 break; | 493 break; |
| 490 | 494 |
| 491 case 'help': | 495 case 'help': |
| 492 case '?': | 496 case '?': |
| 493 this.helpCommand_(args); | 497 this.helpCommand_(args); |
| 494 // Return undefined to indicate command handled internally (no JSON). | 498 // Return undefined to indicate command handled internally (no JSON). |
| 495 this.request_ = void 0; | 499 this.request_ = void 0; |
| 496 break; | 500 break; |
| 497 | 501 |
| 502 case 'liveobjectlist': | |
| 503 case 'lol': | |
| 504 if (lol_is_enabled) { | |
| 505 this.request_ = this.lolToJSONRequest_(args, is_repeating); | |
| 506 break; | |
| 507 } | |
| 508 | |
| 498 default: | 509 default: |
| 499 throw new Error('Unknown command "' + cmd + '"'); | 510 throw new Error('Unknown command "' + cmd + '"'); |
| 500 } | 511 } |
| 501 } | 512 } |
| 502 | 513 |
| 503 DebugRequest.prototype.JSONRequest = function() { | 514 DebugRequest.prototype.JSONRequest = function() { |
| 504 return this.request_; | 515 return this.request_; |
| 505 } | 516 } |
| 506 | 517 |
| 507 | 518 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 532 json += '}'; | 543 json += '}'; |
| 533 return json; | 544 return json; |
| 534 } | 545 } |
| 535 | 546 |
| 536 | 547 |
| 537 DebugRequest.prototype.createRequest = function(command) { | 548 DebugRequest.prototype.createRequest = function(command) { |
| 538 return new RequestPacket(command); | 549 return new RequestPacket(command); |
| 539 }; | 550 }; |
| 540 | 551 |
| 541 | 552 |
| 553 // Note: we use detected command repetition as a signal for continuation here. | |
| 554 DebugRequest.prototype.createLOLRequest = function(command, | |
| 555 start_index, | |
| 556 lines_to_dump, | |
| 557 is_continuation) { | |
| 558 if (is_continuation) { | |
| 559 start_index = lol_next_dump_index; | |
| 560 } | |
| 561 | |
| 562 if (lines_to_dump) { | |
| 563 lines_to_dump = parseInt(lines_to_dump); | |
| 564 } else { | |
| 565 lines_to_dump = kDefaultLolLinesToPrintAtATime; | |
| 566 } | |
| 567 if (lines_to_dump > kMaxLolLinesToPrintAtATime) { | |
| 568 lines_to_dump = kMaxLolLinesToPrintAtATime; | |
| 569 } | |
| 570 | |
| 571 // Save the next start_index to dump from: | |
| 572 lol_next_dump_index = start_index + lines_to_dump; | |
| 573 | |
| 574 var request = this.createRequest(command); | |
| 575 request.arguments = {}; | |
| 576 request.arguments.start = start_index; | |
| 577 request.arguments.count = lines_to_dump; | |
| 578 | |
| 579 return request; | |
| 580 }; | |
| 581 | |
| 582 | |
| 542 // Create a JSON request for the evaluation command. | 583 // Create a JSON request for the evaluation command. |
| 543 DebugRequest.prototype.makeEvaluateJSONRequest_ = function(expression) { | 584 DebugRequest.prototype.makeEvaluateJSONRequest_ = function(expression) { |
| 544 // Global varaible used to store whether a handle was requested. | 585 // Global varaible used to store whether a handle was requested. |
| 545 lookup_handle = null; | 586 lookup_handle = null; |
| 587 | |
| 588 if (lol_is_enabled) { | |
| 589 // Check if the expression is a obj id in the form @<obj id>. | |
| 590 var obj_id_match = expression.match(/^@([0-9]+)$/); | |
| 591 if (obj_id_match) { | |
| 592 // Remember the handle requested in a global variable. | |
|
Søren Thygesen Gjesse
2011/01/19 08:36:40
Maybe change handle to id here to keep the distinc
marklam
2011/01/19 09:04:02
This comment is a cut-and-paste error from the # c
| |
| 593 var obj_id = parseInt(obj_id_match[1]); | |
| 594 // Build a dump request. | |
| 595 var request = this.createRequest('getobj'); | |
| 596 request.arguments = {}; | |
| 597 request.arguments.obj_id = obj_id; | |
| 598 return request.toJSONProtocol(); | |
| 599 } | |
| 600 } | |
| 601 | |
| 546 // Check if the expression is a handle id in the form #<handle>#. | 602 // Check if the expression is a handle id in the form #<handle>#. |
| 547 var handle_match = expression.match(/^#([0-9]*)#$/); | 603 var handle_match = expression.match(/^#([0-9]*)#$/); |
| 548 if (handle_match) { | 604 if (handle_match) { |
| 549 // Remember the handle requested in a global variable. | 605 // Remember the handle requested in a global variable. |
| 550 lookup_handle = parseInt(handle_match[1]); | 606 lookup_handle = parseInt(handle_match[1]); |
| 551 // Build a lookup request. | 607 // Build a lookup request. |
| 552 var request = this.createRequest('lookup'); | 608 var request = this.createRequest('lookup'); |
| 553 request.arguments = {}; | 609 request.arguments = {}; |
| 554 request.arguments.handles = [ lookup_handle ]; | 610 request.arguments.handles = [ lookup_handle ]; |
| 555 return request.toJSONProtocol(); | 611 return request.toJSONProtocol(); |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1096 request = this.createRequest('listbreakpoints'); | 1152 request = this.createRequest('listbreakpoints'); |
| 1097 last_cmd = 'info break'; | 1153 last_cmd = 'info break'; |
| 1098 } else if (args && (args == 'locals' || args == 'lo')) { | 1154 } else if (args && (args == 'locals' || args == 'lo')) { |
| 1099 // Build a evaluate request from the text command. | 1155 // Build a evaluate request from the text command. |
| 1100 request = this.createRequest('frame'); | 1156 request = this.createRequest('frame'); |
| 1101 last_cmd = 'info locals'; | 1157 last_cmd = 'info locals'; |
| 1102 } else if (args && (args == 'args' || args == 'ar')) { | 1158 } else if (args && (args == 'args' || args == 'ar')) { |
| 1103 // Build a evaluate request from the text command. | 1159 // Build a evaluate request from the text command. |
| 1104 request = this.createRequest('frame'); | 1160 request = this.createRequest('frame'); |
| 1105 last_cmd = 'info args'; | 1161 last_cmd = 'info args'; |
| 1162 } else if (lol_is_enabled && | |
| 1163 args && (args == 'liveobjectlist' || args == 'lol')) { | |
| 1164 // Build a evaluate request from the text command. | |
| 1165 return this.liveObjectListToJSONRequest_(null); | |
| 1106 } else { | 1166 } else { |
| 1107 throw new Error('Invalid info arguments.'); | 1167 throw new Error('Invalid info arguments.'); |
| 1108 } | 1168 } |
| 1109 | 1169 |
| 1110 return request.toJSONProtocol(); | 1170 return request.toJSONProtocol(); |
| 1111 }; | 1171 }; |
| 1112 | 1172 |
| 1113 | 1173 |
| 1114 DebugRequest.prototype.v8FlagsToJSONRequest_ = function(args) { | 1174 DebugRequest.prototype.v8FlagsToJSONRequest_ = function(args) { |
| 1115 var request; | 1175 var request; |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 1146 break; | 1206 break; |
| 1147 } | 1207 } |
| 1148 // Else fall thru to the default case below to report the error. | 1208 // Else fall thru to the default case below to report the error. |
| 1149 default: | 1209 default: |
| 1150 throw new Error('Missing arguments after ' + cmd + '.'); | 1210 throw new Error('Missing arguments after ' + cmd + '.'); |
| 1151 } | 1211 } |
| 1152 return request.toJSONProtocol(); | 1212 return request.toJSONProtocol(); |
| 1153 }; | 1213 }; |
| 1154 | 1214 |
| 1155 | 1215 |
| 1216 // Args: [v[erbose]] [<N>] [i[ndex] <i>] [t[ype] <type>] [sp[ace] <space>] | |
| 1217 DebugRequest.prototype.lolMakeListRequest = | |
| 1218 function(cmd, args, first_arg_index, is_repeating) { | |
| 1219 | |
| 1220 var request; | |
| 1221 var start_index = 0; | |
| 1222 var dump_limit = void 0; | |
| 1223 var type_filter = void 0; | |
| 1224 var space_filter = void 0; | |
| 1225 var prop_filter = void 0; | |
| 1226 var is_verbose = false; | |
| 1227 var i; | |
| 1228 | |
| 1229 for (i = first_arg_index; i < args.length; i++) { | |
| 1230 var arg = args[i]; | |
| 1231 // Check for [v[erbose]]: | |
| 1232 if (arg === 'verbose' || arg === 'v') { | |
| 1233 // Nothing to do. This is already implied by args.length > 3. | |
| 1234 is_verbose = true; | |
| 1235 | |
| 1236 // Check for [<N>]: | |
| 1237 } else if (arg.match(/^[0-9]+$/)) { | |
| 1238 dump_limit = arg; | |
| 1239 is_verbose = true; | |
| 1240 | |
| 1241 // Check for i[ndex] <i>: | |
| 1242 } else if (arg === 'index' || arg === 'i') { | |
| 1243 i++; | |
| 1244 if (args.length < i) { | |
| 1245 throw new Error('Missing index after ' + arg + '.'); | |
| 1246 } | |
| 1247 start_index = parseInt(args[i]); | |
| 1248 // The user input start index starts at 1: | |
| 1249 if (start_index <= 0) { | |
| 1250 throw new Error('Invalid index ' + args[i] + '.'); | |
| 1251 } | |
| 1252 start_index -= 1; | |
| 1253 is_verbose = true; | |
| 1254 | |
| 1255 // Check for t[ype] <type>: | |
| 1256 } else if (arg === 'type' || arg === 't') { | |
| 1257 i++; | |
| 1258 if (args.length < i) { | |
| 1259 throw new Error('Missing type after ' + arg + '.'); | |
| 1260 } | |
| 1261 type_filter = args[i]; | |
| 1262 | |
| 1263 // Check for space <heap space name>: | |
| 1264 } else if (arg === 'space' || arg === 'sp') { | |
| 1265 i++; | |
| 1266 if (args.length < i) { | |
| 1267 throw new Error('Missing space name after ' + arg + '.'); | |
| 1268 } | |
| 1269 space_filter = args[i]; | |
| 1270 | |
| 1271 // Check for property <prop name>: | |
| 1272 } else if (arg === 'property' || arg === 'prop') { | |
| 1273 i++; | |
| 1274 if (args.length < i) { | |
| 1275 throw new Error('Missing property name after ' + arg + '.'); | |
| 1276 } | |
| 1277 prop_filter = args[i]; | |
| 1278 | |
| 1279 } else { | |
| 1280 throw new Error('Unknown args at ' + arg + '.'); | |
| 1281 } | |
| 1282 } | |
| 1283 | |
| 1284 // Build the verbose request: | |
| 1285 if (is_verbose) { | |
| 1286 request = this.createLOLRequest('lol-'+cmd, | |
| 1287 start_index, | |
| 1288 dump_limit, | |
| 1289 is_repeating); | |
| 1290 request.arguments.verbose = true; | |
| 1291 } else { | |
| 1292 request = this.createRequest('lol-'+cmd); | |
| 1293 request.arguments = {}; | |
| 1294 } | |
| 1295 | |
| 1296 request.arguments.filter = {}; | |
| 1297 if (type_filter) { | |
| 1298 request.arguments.filter.type = type_filter; | |
| 1299 } | |
| 1300 if (space_filter) { | |
| 1301 request.arguments.filter.space = space_filter; | |
| 1302 } | |
| 1303 if (prop_filter) { | |
| 1304 request.arguments.filter.prop = prop_filter; | |
| 1305 } | |
| 1306 | |
| 1307 return request; | |
| 1308 } | |
| 1309 | |
| 1310 | |
| 1311 function extractObjId(args) { | |
| 1312 var id = args; | |
| 1313 id = id.match(/^@([0-9]+)$/); | |
| 1314 if (id) { | |
| 1315 id = id[1]; | |
| 1316 } else { | |
| 1317 throw new Error('Invalid obj id ' + args + '.'); | |
| 1318 } | |
| 1319 return parseInt(id); | |
| 1320 } | |
| 1321 | |
| 1322 | |
| 1323 DebugRequest.prototype.lolToJSONRequest_ = function(args, is_repeating) { | |
| 1324 var request; | |
| 1325 // Use default command if one is not specified: | |
| 1326 if (!args) { | |
| 1327 args = 'info'; | |
| 1328 } | |
| 1329 | |
| 1330 var orig_args = args; | |
| 1331 var first_arg_index; | |
| 1332 | |
| 1333 var arg, i; | |
| 1334 var args = args.split(/\s+/g); | |
| 1335 var cmd = args[0]; | |
| 1336 var id; | |
| 1337 | |
| 1338 // Command: <id> [v[erbose]] ... | |
| 1339 if (cmd.match(/^[0-9]+$/)) { | |
| 1340 // Convert to the padded list command: | |
| 1341 // Command: l[ist] <dummy> <id> [v[erbose]] ... | |
| 1342 | |
| 1343 // Insert the implicit 'list' in front and process as normal: | |
| 1344 cmd = 'list'; | |
| 1345 args.unshift(cmd); | |
| 1346 } | |
| 1347 | |
| 1348 switch(cmd) { | |
| 1349 // Command: c[apture] | |
| 1350 case 'capture': | |
| 1351 case 'c': | |
| 1352 request = this.createRequest('lol-capture'); | |
| 1353 break; | |
| 1354 | |
| 1355 // Command: clear|d[elete] <id>|all | |
| 1356 case 'clear': | |
| 1357 case 'delete': | |
| 1358 case 'del': { | |
| 1359 if (args.length < 2) { | |
| 1360 throw new Error('Missing argument after ' + cmd + '.'); | |
| 1361 } else if (args.length > 2) { | |
| 1362 throw new Error('Too many arguments after ' + cmd + '.'); | |
| 1363 } | |
| 1364 id = args[1]; | |
| 1365 if (id.match(/^[0-9]+$/)) { | |
| 1366 // Delete a specific lol record: | |
| 1367 request = this.createRequest('lol-delete'); | |
| 1368 request.arguments = {}; | |
| 1369 request.arguments.id = parseInt(id); | |
| 1370 } else if (id === 'all') { | |
| 1371 // Delete all: | |
| 1372 request = this.createRequest('lol-reset'); | |
| 1373 } else { | |
| 1374 throw new Error('Invalid argument after ' + cmd + '.'); | |
| 1375 } | |
| 1376 break; | |
| 1377 } | |
| 1378 | |
| 1379 // Command: diff <id1> <id2> [<dump options>] | |
| 1380 case 'diff': | |
| 1381 first_arg_index = 3; | |
| 1382 | |
| 1383 // Command: list <dummy> <id> [<dump options>] | |
| 1384 case 'list': | |
| 1385 | |
| 1386 // Command: ret[ainers] <obj id> [<dump options>] | |
| 1387 case 'retainers': | |
| 1388 case 'ret': | |
| 1389 case 'retaining-paths': | |
| 1390 case 'rp': { | |
| 1391 if (cmd === 'ret') cmd = 'retainers'; | |
| 1392 else if (cmd === 'rp') cmd = 'retaining-paths'; | |
| 1393 | |
| 1394 if (!first_arg_index) first_arg_index = 2; | |
| 1395 | |
| 1396 if (args.length < first_arg_index) { | |
| 1397 throw new Error('Too few arguments after ' + cmd + '.'); | |
| 1398 } | |
| 1399 | |
| 1400 var request_cmd = (cmd === 'list') ? 'diff':cmd; | |
| 1401 request = this.lolMakeListRequest(request_cmd, | |
| 1402 args, | |
| 1403 first_arg_index, | |
| 1404 is_repeating); | |
| 1405 | |
| 1406 if (cmd === 'diff') { | |
| 1407 request.arguments.id1 = parseInt(args[1]); | |
| 1408 request.arguments.id2 = parseInt(args[2]); | |
| 1409 } else if (cmd == 'list') { | |
| 1410 request.arguments.id1 = 0; | |
| 1411 request.arguments.id2 = parseInt(args[1]); | |
| 1412 } else { | |
| 1413 request.arguments.id = extractObjId(args[1]); | |
| 1414 } | |
| 1415 break; | |
| 1416 } | |
| 1417 | |
| 1418 // Command: getid | |
| 1419 case 'getid': { | |
| 1420 request = this.createRequest('lol-getid'); | |
| 1421 request.arguments = {}; | |
| 1422 request.arguments.address = args[1]; | |
| 1423 break; | |
| 1424 } | |
| 1425 | |
| 1426 // Command: inf[o] [<N>] | |
| 1427 case 'info': | |
| 1428 case 'inf': { | |
| 1429 if (args.length > 2) { | |
| 1430 throw new Error('Too many arguments after ' + cmd + '.'); | |
| 1431 } | |
| 1432 // Built the info request: | |
| 1433 request = this.createLOLRequest('lol-info', 0, args[1], is_repeating); | |
| 1434 break; | |
| 1435 } | |
| 1436 | |
| 1437 // Command: path <obj id 1> <obj id 2> | |
| 1438 case 'path': { | |
| 1439 request = this.createRequest('lol-path'); | |
| 1440 request.arguments = {}; | |
| 1441 if (args.length > 2) { | |
| 1442 request.arguments.id1 = extractObjId(args[1]); | |
| 1443 request.arguments.id2 = extractObjId(args[2]); | |
| 1444 } else { | |
| 1445 request.arguments.id1 = 0; | |
| 1446 request.arguments.id2 = extractObjId(args[1]); | |
| 1447 } | |
| 1448 break; | |
| 1449 } | |
| 1450 | |
| 1451 // Command: print | |
| 1452 case 'print': { | |
| 1453 request = this.createRequest('lol-print'); | |
| 1454 request.arguments = {}; | |
| 1455 request.arguments.id = extractObjId(args[1]); | |
| 1456 break; | |
| 1457 } | |
| 1458 | |
| 1459 // Command: reset | |
| 1460 case 'reset': { | |
| 1461 request = this.createRequest('lol-reset'); | |
| 1462 break; | |
| 1463 } | |
| 1464 | |
| 1465 default: | |
| 1466 throw new Error('Invalid arguments.'); | |
| 1467 } | |
| 1468 return request.toJSONProtocol(); | |
| 1469 }; | |
| 1470 | |
| 1471 | |
| 1156 // Create a JSON request for the threads command. | 1472 // Create a JSON request for the threads command. |
| 1157 DebugRequest.prototype.threadsCommandToJSONRequest_ = function(args) { | 1473 DebugRequest.prototype.threadsCommandToJSONRequest_ = function(args) { |
| 1158 // Build a threads request from the text command. | 1474 // Build a threads request from the text command. |
| 1159 var request = this.createRequest('threads'); | 1475 var request = this.createRequest('threads'); |
| 1160 return request.toJSONProtocol(); | 1476 return request.toJSONProtocol(); |
| 1161 }; | 1477 }; |
| 1162 | 1478 |
| 1163 | 1479 |
| 1164 // Handle the trace command. | 1480 // Handle the trace command. |
| 1165 DebugRequest.prototype.traceCommand_ = function(args) { | 1481 DebugRequest.prototype.traceCommand_ = function(args) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1232 print('set <var> = <expression> - executes the specified statement'); | 1548 print('set <var> = <expression> - executes the specified statement'); |
| 1233 print(''); | 1549 print(''); |
| 1234 print('l[ist] - list the source code around for the curren t pc'); | 1550 print('l[ist] - list the source code around for the curren t pc'); |
| 1235 print('l[ist] [- | <start>,<end>] - list the specified range of source code'); | 1551 print('l[ist] [- | <start>,<end>] - list the specified range of source code'); |
| 1236 print('source [from line [num lines]]'); | 1552 print('source [from line [num lines]]'); |
| 1237 print('scr[ipts] [native|extensions|all]'); | 1553 print('scr[ipts] [native|extensions|all]'); |
| 1238 print('scr[ipts] [<filter text>] - list scripts with the specified text in it s description'); | 1554 print('scr[ipts] [<filter text>] - list scripts with the specified text in it s description'); |
| 1239 print(''); | 1555 print(''); |
| 1240 print('gc - runs the garbage collector'); | 1556 print('gc - runs the garbage collector'); |
| 1241 print(''); | 1557 print(''); |
| 1558 | |
| 1559 if (lol_is_enabled) { | |
| 1560 print('liveobjectlist|lol <command> - live object list tracking.'); | |
| 1561 print(' where <command> can be:'); | |
| 1562 print(' c[apture] - captures a LOL list.'); | |
| 1563 print(' clear|del[ete] <id>|all - clears LOL of id <id>.'); | |
| 1564 print(' If \'all\' is unspecified instead, will c lear all.'); | |
| 1565 print(' diff <id1> <id2> [<dump options>]'); | |
| 1566 print(' - prints the diff between LOLs id1 and id2. '); | |
| 1567 print(' - also see <dump options> below.'); | |
| 1568 print(' getid <address> - gets the obj id for the specified address if available.'); | |
| 1569 print(' The address must be in hex form prefixed with 0x.'); | |
| 1570 print(' inf[o] [<N>] - lists summary info of all LOL lists.'); | |
| 1571 print(' If N is specified, will print N items at a time.'); | |
| 1572 print(' [l[ist]] <id> [<dump options>]'); | |
| 1573 print(' - prints the listing of objects in LOL id.' ); | |
| 1574 print(' - also see <dump options> below.'); | |
| 1575 print(' reset - clears all LOL lists.'); | |
| 1576 print(' ret[ainers] <id> [<dump options>]'); | |
| 1577 print(' - prints the list of retainers of obj id.') ; | |
| 1578 print(' - also see <dump options> below.'); | |
| 1579 print(' path <id1> <id2> - prints the retaining path from obj id1 to id2.'); | |
| 1580 print(' If only one id is specified, will print t he path from'); | |
| 1581 print(' roots to the specified object if availabl e.'); | |
| 1582 print(' print <id> - prints the obj for the specified obj id i f available.'); | |
| 1583 print(''); | |
| 1584 print(' <dump options> includes:'); | |
| 1585 print(' [v[erbose]] - do verbose dump.'); | |
| 1586 print(' [<N>] - dump N items at a time. Implies verbos e dump.'); | |
| 1587 print(' If unspecified, N will default to '+ | |
| 1588 kDefaultLolLinesToPrintAtATime+'. Max N is '+ | |
| 1589 kMaxLolLinesToPrintAtATime+'.'); | |
| 1590 print(' [i[ndex] <i>] - start dump from index i. Implies verbo se dump.'); | |
| 1591 print(' [t[ype] <type>] - filter by type.'); | |
| 1592 print(' [sp[ace] <space name>] - filter by heap space where <space name> is one of'); | |
| 1593 print(' { cell, code, lo, map, new, old-data, o ld-pointer }.'); | |
| 1594 print(''); | |
| 1595 print(' If the verbose option, or an option that implies a verbose dump' ); | |
| 1596 print(' is specified, then a verbose dump will requested. Else, a summa ry dump'); | |
| 1597 print(' will be requested.'); | |
| 1598 print(''); | |
| 1599 } | |
| 1600 | |
| 1242 print('trace compile'); | 1601 print('trace compile'); |
| 1243 // hidden command: trace debug json - toggles tracing of debug json packets | 1602 // hidden command: trace debug json - toggles tracing of debug json packets |
| 1244 print(''); | 1603 print(''); |
| 1245 print('disconnect|exit|quit - disconnects and quits the debugger'); | 1604 print('disconnect|exit|quit - disconnects and quits the debugger'); |
| 1246 print('help - prints this help information'); | 1605 print('help - prints this help information'); |
| 1247 } | 1606 } |
| 1248 | 1607 |
| 1249 | 1608 |
| 1250 function formatHandleReference_(value) { | 1609 function formatHandleReference_(value) { |
| 1251 if (value.handle() >= 0) { | 1610 if (value.handle() >= 0) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1332 result = '"' + value.value() + '"'; | 1691 result = '"' + value.value() + '"'; |
| 1333 } else if (value.isPrimitive()) { | 1692 } else if (value.isPrimitive()) { |
| 1334 result = value.valueString(); | 1693 result = value.valueString(); |
| 1335 } else if (value.isObject()) { | 1694 } else if (value.isObject()) { |
| 1336 result += formatObject_(value, true); | 1695 result += formatObject_(value, true); |
| 1337 } | 1696 } |
| 1338 return result; | 1697 return result; |
| 1339 } | 1698 } |
| 1340 | 1699 |
| 1341 | 1700 |
| 1701 function decodeLolCaptureResponse(body) { | |
| 1702 var result; | |
| 1703 result = 'Captured live object list '+ body.id + | |
| 1704 ': count '+ body.count + ' size ' + body.size; | |
| 1705 return result; | |
| 1706 } | |
| 1707 | |
| 1708 | |
| 1709 function decodeLolDeleteResponse(body) { | |
| 1710 var result; | |
| 1711 result = 'Deleted live object list '+ body.id; | |
| 1712 return result; | |
| 1713 } | |
| 1714 | |
| 1715 | |
| 1716 function digitsIn(value) { | |
| 1717 var digits = 0; | |
| 1718 if (value === 0) value = 1; | |
| 1719 while (value >= 1) { | |
| 1720 digits++; | |
| 1721 value /= 10; | |
| 1722 } | |
| 1723 return digits; | |
| 1724 } | |
| 1725 | |
| 1726 | |
| 1727 function padding(value, max_digits) { | |
| 1728 var padding_digits = max_digits - digitsIn(value); | |
| 1729 var padding = ''; | |
| 1730 while (padding_digits > 0) { | |
| 1731 padding += ' '; | |
| 1732 padding_digits--; | |
| 1733 } | |
| 1734 return padding; | |
| 1735 } | |
| 1736 | |
| 1737 | |
| 1738 function decodeLolInfoResponse(body) { | |
| 1739 var result; | |
| 1740 var lists = body.lists; | |
| 1741 var length = lists.length; | |
| 1742 var first_index = body.first_index + 1; | |
| 1743 var has_more = ((first_index + length) <= body.count); | |
| 1744 result = 'captured live object lists'; | |
| 1745 if (has_more || (first_index != 1)) { | |
| 1746 result += ' ['+ length +' of '+ body.count + | |
| 1747 ': starting from '+ first_index +']'; | |
| 1748 } | |
| 1749 result += ':\n'; | |
| 1750 var max_digits = digitsIn(body.count); | |
| 1751 var last_count = 0; | |
| 1752 var last_size = 0; | |
| 1753 for (var i = 0; i < length; i++) { | |
| 1754 var entry = lists[i]; | |
| 1755 var count = entry.count; | |
| 1756 var size = entry.size; | |
| 1757 var index = first_index + i; | |
| 1758 result += ' [' + padding(index, max_digits) + index + '] id '+ entry.id + | |
| 1759 ': count '+ count; | |
| 1760 if (last_count > 0) { | |
| 1761 result += '(+' + (count - last_count) + ')'; | |
| 1762 } | |
| 1763 result += ' size '+ size; | |
| 1764 if (last_size > 0) { | |
| 1765 result += '(+' + (size - last_size) + ')'; | |
| 1766 } | |
| 1767 result += '\n'; | |
| 1768 last_count = count; | |
| 1769 last_size = size; | |
| 1770 } | |
| 1771 result += ' total: '+length+' lists\n'; | |
| 1772 if (has_more) { | |
| 1773 result += ' -- press <enter> for more --\n'; | |
| 1774 } else { | |
| 1775 repeat_cmd_line = ''; | |
| 1776 } | |
| 1777 if (length === 0) result += ' none\n'; | |
| 1778 | |
| 1779 return result; | |
| 1780 } | |
| 1781 | |
| 1782 | |
| 1783 function decodeLolListResponse(body, title) { | |
| 1784 | |
| 1785 var result; | |
| 1786 var total_count = body.count; | |
| 1787 var total_size = body.size; | |
| 1788 var length; | |
| 1789 var max_digits; | |
| 1790 var i; | |
| 1791 var entry; | |
| 1792 var index; | |
| 1793 | |
| 1794 var max_count_digits = digitsIn(total_count); | |
| 1795 var max_size_digits; | |
| 1796 | |
| 1797 var summary = body.summary; | |
| 1798 if (summary) { | |
| 1799 | |
| 1800 var roots_count = 0; | |
| 1801 var found_root = body.found_root || 0; | |
| 1802 var found_weak_root = body.found_weak_root || 0; | |
| 1803 | |
| 1804 // Print the summary result: | |
| 1805 result = 'summary of objects:\n'; | |
| 1806 length = summary.length; | |
| 1807 if (found_root !== 0) { | |
| 1808 roots_count++; | |
| 1809 } | |
| 1810 if (found_weak_root !== 0) { | |
| 1811 roots_count++; | |
| 1812 } | |
| 1813 max_digits = digitsIn(length + roots_count); | |
| 1814 max_size_digits = digitsIn(total_size); | |
| 1815 | |
| 1816 index = 1; | |
| 1817 if (found_root !== 0) { | |
| 1818 result += ' [' + padding(index, max_digits) + index + '] ' + | |
| 1819 ' count '+ 1 + padding(0, max_count_digits) + | |
| 1820 ' '+ padding(0, max_size_digits+1) + | |
| 1821 ' : <root>\n'; | |
| 1822 index++; | |
| 1823 } | |
| 1824 if (found_weak_root !== 0) { | |
| 1825 result += ' [' + padding(index, max_digits) + index + '] ' + | |
| 1826 ' count '+ 1 + padding(0, max_count_digits) + | |
| 1827 ' '+ padding(0, max_size_digits+1) + | |
| 1828 ' : <weak root>\n'; | |
| 1829 index++; | |
| 1830 } | |
| 1831 | |
| 1832 for (i = 0; i < length; i++) { | |
| 1833 entry = summary[i]; | |
| 1834 var count = entry.count; | |
| 1835 var size = entry.size; | |
| 1836 result += ' [' + padding(index, max_digits) + index + '] ' + | |
| 1837 ' count '+ count + padding(count, max_count_digits) + | |
| 1838 ' size '+ size + padding(size, max_size_digits) + | |
| 1839 ' : <' + entry.desc + '>\n'; | |
| 1840 index++; | |
| 1841 } | |
| 1842 result += '\n total count: '+(total_count+roots_count)+'\n'; | |
| 1843 if (body.size) { | |
| 1844 result += ' total size: '+body.size+'\n'; | |
| 1845 } | |
| 1846 | |
| 1847 } else { | |
| 1848 // Print the full dump result: | |
| 1849 var first_index = body.first_index + 1; | |
| 1850 var elements = body.elements; | |
| 1851 length = elements.length; | |
| 1852 var has_more = ((first_index + length) <= total_count); | |
| 1853 result = title; | |
| 1854 if (has_more || (first_index != 1)) { | |
| 1855 result += ' ['+ length +' of '+ total_count + | |
| 1856 ': starting from '+ first_index +']'; | |
| 1857 } | |
| 1858 result += ':\n'; | |
| 1859 if (length === 0) result += ' none\n'; | |
| 1860 max_digits = digitsIn(length); | |
| 1861 | |
| 1862 var max_id = 0; | |
| 1863 var max_size = 0; | |
| 1864 for (i = 0; i < length; i++) { | |
| 1865 entry = elements[i]; | |
| 1866 if (entry.id > max_id) max_id = entry.id; | |
| 1867 if (entry.size > max_size) max_size = entry.size; | |
| 1868 } | |
| 1869 var max_id_digits = digitsIn(max_id); | |
| 1870 max_size_digits = digitsIn(max_size); | |
| 1871 | |
| 1872 for (i = 0; i < length; i++) { | |
| 1873 entry = elements[i]; | |
| 1874 index = first_index + i; | |
| 1875 result += ' ['+ padding(index, max_digits) + index +']'; | |
| 1876 if (entry.id !== 0) { | |
| 1877 result += ' @' + entry.id + padding(entry.id, max_id_digits) + | |
| 1878 ': size ' + entry.size + ', ' + | |
| 1879 padding(entry.size, max_size_digits) + entry.desc + '\n'; | |
| 1880 } else { | |
| 1881 // Must be a root or weak root: | |
| 1882 result += ' ' + entry.desc + '\n'; | |
| 1883 } | |
| 1884 } | |
| 1885 if (has_more) { | |
| 1886 result += ' -- press <enter> for more --\n'; | |
| 1887 } else { | |
| 1888 repeat_cmd_line = ''; | |
| 1889 } | |
| 1890 if (length === 0) result += ' none\n'; | |
| 1891 } | |
| 1892 | |
| 1893 return result; | |
| 1894 } | |
| 1895 | |
| 1896 | |
| 1897 function decodeLolDiffResponse(body) { | |
| 1898 var title = 'objects'; | |
| 1899 return decodeLolListResponse(body, title); | |
| 1900 } | |
| 1901 | |
| 1902 | |
| 1903 function decodeLolRetainersResponse(body) { | |
| 1904 var title = 'retainers for @' + body.id; | |
| 1905 return decodeLolListResponse(body, title); | |
| 1906 } | |
| 1907 | |
| 1908 | |
| 1909 function decodeLolPathResponse(body) { | |
| 1910 return body.path; | |
| 1911 } | |
| 1912 | |
| 1913 | |
| 1914 function decodeLolResetResponse(body) { | |
| 1915 return 'Reset all live object lists.'; | |
| 1916 } | |
| 1917 | |
| 1918 | |
| 1919 function decodeLolGetIdResponse(body) { | |
| 1920 if (body.id == 0) { | |
| 1921 return 'Address is invalid, or object has been moved or collected'; | |
| 1922 } | |
| 1923 return 'obj id is @' + body.id; | |
| 1924 } | |
| 1925 | |
| 1926 | |
| 1927 function decodeLolPrintResponse(body) { | |
| 1928 return body.dump; | |
| 1929 } | |
| 1930 | |
| 1931 | |
| 1342 // Rounds number 'num' to 'length' decimal places. | 1932 // Rounds number 'num' to 'length' decimal places. |
| 1343 function roundNumber(num, length) { | 1933 function roundNumber(num, length) { |
| 1344 var factor = Math.pow(10, length); | 1934 var factor = Math.pow(10, length); |
| 1345 return Math.round(num * factor) / factor; | 1935 return Math.round(num * factor) / factor; |
| 1346 } | 1936 } |
| 1347 | 1937 |
| 1348 | 1938 |
| 1349 // Convert a JSON response to text for display in a text based debugger. | 1939 // Convert a JSON response to text for display in a text based debugger. |
| 1350 function DebugResponseDetails(response) { | 1940 function DebugResponseDetails(response) { |
| 1351 details = {text:'', running:false} | 1941 details = {text:'', running:false} |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1503 case 'scope': | 2093 case 'scope': |
| 1504 result += formatScope_(body); | 2094 result += formatScope_(body); |
| 1505 result += '\n'; | 2095 result += '\n'; |
| 1506 var scope_object_value = response.lookup(body.object.ref); | 2096 var scope_object_value = response.lookup(body.object.ref); |
| 1507 result += formatObject_(scope_object_value, true); | 2097 result += formatObject_(scope_object_value, true); |
| 1508 details.text = result; | 2098 details.text = result; |
| 1509 break; | 2099 break; |
| 1510 | 2100 |
| 1511 case 'evaluate': | 2101 case 'evaluate': |
| 1512 case 'lookup': | 2102 case 'lookup': |
| 2103 case 'getobj': | |
| 1513 if (last_cmd == 'p' || last_cmd == 'print') { | 2104 if (last_cmd == 'p' || last_cmd == 'print') { |
| 1514 result = body.text; | 2105 result = body.text; |
| 1515 } else { | 2106 } else { |
| 1516 var value; | 2107 var value; |
| 1517 if (lookup_handle) { | 2108 if (lookup_handle) { |
| 1518 value = response.bodyValue(lookup_handle); | 2109 value = response.bodyValue(lookup_handle); |
| 1519 } else { | 2110 } else { |
| 1520 value = response.bodyValue(); | 2111 value = response.bodyValue(); |
| 1521 } | 2112 } |
| 1522 if (value.isObject()) { | 2113 if (value.isObject()) { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1664 details.text += | 2255 details.text += |
| 1665 " (" + roundNumber(body.before/(1024*1024), 1) + "M => " + | 2256 " (" + roundNumber(body.before/(1024*1024), 1) + "M => " + |
| 1666 roundNumber(body.after/(1024*1024), 1) + "M)"; | 2257 roundNumber(body.after/(1024*1024), 1) + "M)"; |
| 1667 } else if (body.after > 1024) { | 2258 } else if (body.after > 1024) { |
| 1668 details.text += | 2259 details.text += |
| 1669 " (" + roundNumber(body.before/1024, 1) + "K => " + | 2260 " (" + roundNumber(body.before/1024, 1) + "K => " + |
| 1670 roundNumber(body.after/1024, 1) + "K)"; | 2261 roundNumber(body.after/1024, 1) + "K)"; |
| 1671 } | 2262 } |
| 1672 break; | 2263 break; |
| 1673 | 2264 |
| 2265 case 'lol-capture': | |
| 2266 details.text = decodeLolCaptureResponse(body); | |
| 2267 break; | |
| 2268 case 'lol-delete': | |
| 2269 details.text = decodeLolDeleteResponse(body); | |
| 2270 break; | |
| 2271 case 'lol-diff': | |
| 2272 details.text = decodeLolDiffResponse(body); | |
| 2273 break; | |
| 2274 case 'lol-getid': | |
| 2275 details.text = decodeLolGetIdResponse(body); | |
| 2276 break; | |
| 2277 case 'lol-info': | |
| 2278 details.text = decodeLolInfoResponse(body); | |
| 2279 break; | |
| 2280 case 'lol-print': | |
| 2281 details.text = decodeLolPrintResponse(body); | |
| 2282 break; | |
| 2283 case 'lol-reset': | |
| 2284 details.text = decodeLolResetResponse(body); | |
| 2285 break; | |
| 2286 case 'lol-retainers': | |
| 2287 details.text = decodeLolRetainersResponse(body); | |
| 2288 break; | |
| 2289 case 'lol-path': | |
| 2290 details.text = decodeLolPathResponse(body); | |
| 2291 break; | |
| 2292 | |
| 1674 default: | 2293 default: |
| 1675 details.text = | 2294 details.text = |
| 1676 'Response for unknown command \'' + response.command() + '\'' + | 2295 'Response for unknown command \'' + response.command() + '\'' + |
| 1677 ' (' + response.raw_json() + ')'; | 2296 ' (' + response.raw_json() + ')'; |
| 1678 } | 2297 } |
| 1679 } catch (e) { | 2298 } catch (e) { |
| 1680 details.text = 'Error: "' + e + '" formatting response'; | 2299 details.text = 'Error: "' + e + '" formatting response'; |
| 1681 } | 2300 } |
| 1682 | 2301 |
| 1683 return details; | 2302 return details; |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2171 json += NumberToJSON_(elem); | 2790 json += NumberToJSON_(elem); |
| 2172 } else if (typeof(elem) === 'string') { | 2791 } else if (typeof(elem) === 'string') { |
| 2173 json += StringToJSON_(elem); | 2792 json += StringToJSON_(elem); |
| 2174 } else { | 2793 } else { |
| 2175 json += elem; | 2794 json += elem; |
| 2176 } | 2795 } |
| 2177 } | 2796 } |
| 2178 json += ']'; | 2797 json += ']'; |
| 2179 return json; | 2798 return json; |
| 2180 } | 2799 } |
| OLD | NEW |