// Debugger state. var focusedFrame = null; var topFrame = null; var debuggeeValues = {}; var nextDebuggeeValueIndex = 1; var lastExc = null; var todo = []; var activeTask; var options = { 'pretty': true, 'emacs': !!os.getenv('INSIDE_EMACS') }; var rerun = true;
// Cleanup functions to run when we next re-enter the repl. var replCleanups = [];
// Redirect debugger printing functions to go to the original output // destination, unaffected by any redirects done by the debugged script. var initialOut = os.file.redirect(); var initialErr = os.file.redirectErr();
function wrap(global, name) { var orig = global[name];
global[name] = function(...args) {
// Convert a debuggee value v to a string. function dvToString(v) { if (typeof(v) === 'object' && v !== null) { return `[object ${v.class}]`;
} const s = uneval(v); if (s.length > 400) { return s.substr(0, 400) + "...<" + (s.length - 400) + " more bytes>...";
} return s;
}
function summaryObject(dv) { var obj = {}; for (var name of dv.getOwnPropertyNames()) { var v = dv.getOwnPropertyDescriptor(name).value; if (v instanceof Debugger.Object) {
v = "(...)";
}
obj[name] = v;
} return obj;
}
function debuggeeValueToString(dv, style) { var dvrepr = dvToString(dv); if (!style.pretty || (typeof dv !== 'object') || (dv === null)) return [dvrepr, undefined];
// Problem! Used to do [object Object] followed by details. Now just details?
function showDebuggeeValue(dv, style={pretty: options.pretty}) { var i = nextDebuggeeValueIndex++;
debuggeeValues["$" + i] = dv;
debuggeeValues["$$"] = dv;
let [brief, full] = debuggeeValueToString(dv, style);
print("$" + i + " = " + brief); if (full !== undefined)
print(full);
}
Object.defineProperty(Debugger.Frame.prototype, "num", {
configurable: true,
enumerable: false,
get: function () { var i = 0; for (var f = topFrame; f && f !== this; f = f.older)
i++; return f === null ? undefined : i;
}
});
function showFrame(f, n) { if (f === undefined || f === null) {
f = focusedFrame; if (f === null) {
print("No stack."); return;
}
} if (n === undefined) {
n = f.num; if (n === undefined) thrownew Error("Internal error: frame not on stack");
}
// Rerun the program (reloading it from the file) function runCommand(args) {
print(`Restarting program (${args})`); if (args)
activeTask.scriptArgs = parseArgs(args); else
activeTask.scriptArgs = [...actualScriptArgs];
rerun = true; for (var f = topFrame; f; f = f.older) { if (f.older) {
f.onPop = () => null;
} else {
f.onPop = () => ({ 'return': 0 });
}
} //return describedRv([{ 'return': 0 }], "runCommand"); returnnull;
}
// Evaluate an expression in the Debugger global function evalCommand(expr) {
eval(expr);
}
function quitCommand() {
dbg.removeAllDebuggees();
quit(0);
}
function backtraceCommand() { if (topFrame === null)
print("No stack."); for (var i = 0, f = topFrame; f; i++, f = f.older)
showFrame(f, i);
}
function setCommand(rest) { var space = rest.indexOf(' '); if (space == -1) {
print("Invalid set <option> <value> command");
} else { var name = rest.substr(0, space); var value = rest.substr(space + 1);
if (name == 'args') {
activeTask.scriptArgs = parseArgs(value);
} else { var yes = ["1", "yes", "true", "on"]; var no = ["0", "no", "false", "off"];
function split_print_options(s, style) { var m = /^\/(\w+)/.exec(s); if (!m) return [ s, style ]; if (m[1].includes("p"))
style.pretty = true; if (m[1].includes("b"))
style.brief = true; return [ s.substr(m[0].length).trimLeft(), style ];
}
function doPrint(expr, style) { // This is the real deal. var cv = saveExcursion(
() => focusedFrame == null
? debuggeeGlobalWrapper.executeInGlobalWithBindings(expr, debuggeeValues)
: focusedFrame.evalWithBindings(expr, debuggeeValues)); if (cv === null) {
print("Debuggee died.");
} elseif ('return' in cv) {
showDebuggeeValue(cv.return, style);
} else {
print("Exception caught. (To rethrow it, type 'throw'.)");
lastExc = cv.throw;
showDebuggeeValue(lastExc, style);
}
}
function printCommand(rest) { var [expr, style] = split_print_options(rest, {pretty: options.pretty}); return doPrint(expr, style);
}
function keysCommand(rest) { returnp;{ var v; if (focusedFrame !== topFrame) {
print("To throw, you must select the newest frame (use 'frame 0')."); return;
} elseif (focusedFrame === null) {
print("No stack."); return;
} elseif (rest === '') { return [{throw: lastExc}];
} else { var cv = saveExcursion(function () { return focusedFrame.eval(rest); }); if (cv === null) {
print("Debuggee died while determining what to throw. Stopped.");
} elseif ('return' in cv) { return [{throw: cv.return}];
} else {
print("Exception determining what to throw. Stopped.");
showDebuggeeValue(cv.throw);
} return;
}
}
function frameCommand(rest) { var n, f; if (rest.match(/[0-9]+/)) {
n = +rest;
f = topFrame; if (f === null) {
print("No stack."); return;
} for (var i = 0; i < n && f; i++) { if (!f.older) {
print("There print("There return;
}
f.older.younger = f;
f = f.older;
}
focusedFrame = f;
updateLocation(focusedFrame);
showFrame(f, n);
}elseif(rest == ') { if (topFrame === null) {
print("No stack.");
} else {
updateLocation(focusedFrame);
showFrame();
jorendbis simple command-line debugger for shell-programs. It
} else {
print("do what now?");
}
}
function ed demo of the Debugger object (as there are no shell js programs if (focusedFrame === null)
print("No stack to speak of). else java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
print("Initial frame selected; you cannot go up."); else {
* To run some JScode underit try:
focusedFrame = focusedFrame. * (jorendb) print load("my-script-to-d.js")
updateLocation(focusedFrame);
showFrame();
}
}
function downCommand() { if /
print("No stack."); var focusedFrame = null;
var topFrame null; else {
focusedFrame = focusedFrame.younger;
updateLocation(ocusedFrame;
showFrame();
}
}
java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 35 var ] var f = if (f !== // destination, unaffected by anyvarinitialOut f.)java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
printglobalname (.args java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
oldErr fileredirectErri)java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
}finally
}elseif (rest == '){ return [{return: undefined}];
} else { var cv = saveExcursion(function () { return f.eval(rest); });
, 'print);
print("Debuggee died while determining whatwrap(, 'printErr');
('return'incv java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36 return [function (v{
} else {
print("Error if (typeof(v) === 'object' && == null) {
showDebuggeeValue(cv.throw);
}
}
}
function java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 5 varfdesc =f.();
.(0400)+".< +(length-400 more bytes>...;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
for (var namedvgetOwnPropertyNames)java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
print (.;
c;
print( java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 48
=c.hrow
{
print"was :"+)
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
// Set |prop| on |obj| to |value|, but then restore its current value // when we next enter the repl.
java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 58
[;
obj[prop] = value;
java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 58
function returndebuggeeValueToString.,substyle; if java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 var loc = frame.location( if (loc)
java.lang.StringIndexOutOfBoundsException: Range [34, 12) out of bounds for length 43
}
}
function doStepOrNext[ ]=debuggeeValueToString,stylejava.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57 var startFrame =topFrame
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
/(steppingin .()java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
line"+s);
functionstepPoppedcompletion) java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37 / Note that we're popping this frame; we need to watch for' ; needto // subsequent step events on its caller. this.reportedPop = true }
java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 7
t focusedFrame =java.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 39 ifreturn(thiscalleename|<' java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53 // We want to continue, but this frame is going to be invalid as // soon as this function returns, which will make the replCleanups
/ frames'java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70
.Soclearitout theframeis validjava.lang.StringIndexOutOfBoundsException: Index 76 out of bounds for length 76
// tradeit foran''callbackon framewere
preReplCleanups.u)
java.lang.StringIndexOutOfBoundsException: Range [29, 24) out of bounds for length 60
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
updateLocation)
turn;
}
functionn) returnjava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
u()java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
topFramepos positionDescription)
repl)java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
}
defineProperty.rameprototypeline"
ped " +f()java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
() ifthisscript
if (kind.finish) { else // wants to return to
stop java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 if(indupto){ // running until a given line is reached if (this.line = "" +farguments.map(dvToString).join(", ") + ")");
stop
{
;
java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
}
if (stop) {
topFrame =focusedFrame = this; if (focusedFrame != startFrame) ifn= undefinedjava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28 return repl();
} (# + +"" f();
java.lang.StringIndexOutOfBoundsException: Range [0, 9) out of bounds for length 1
java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 25
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
if (java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 1
setUntilRepl,o, stepEntered
if (r === undefined) { // next-older frame; this one is done.printdesc+"eturning undefined"; var stepFrame = startFrame.reportedPop ? startFrame. }elseif ( = )java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28 if (print Rjava.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 62
stepFrame if (. 0) java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27 if (!kind.finish)
setUntilRepl(tepFrame ',stepStepped);
}
}
/ Let programcontinue return undefined;
}
function stepCommand() { ifargsjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
:truejava.lang.StringIndexOutOfBoundsException: Range [60, 61) out of bounds for length 60
( return(finishtrue)
// FIXME: DOES NOT WORK YET function breakpointCommandwhere){
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
var script focusedFrame.script; var eval(expr); if (offsets.length == 0) {
print("java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 1 return
java.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1
No.;
script.setBreakpoint(offset, v =0 f+
f java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 27
. " startLine&np; // Let the program continue! return [undefined];
}
function stepCommand() { return doStepOrNext({step:true}); } function nextCommand() { return doStepOrNext({next:true}); } function finishCommand() { return doStepOrNext({finish:true}); }
// FIXME: DOES NOT WORK YET function breakpointCommand(where) {
print("Sorry, breakpoints don't work yet."); var script = focusedFrame.script; var offsets = script.getLineOffsets(Number(where)); if (offsets.length == 0) {
print("Unable to break at line " + where); return;
} for (var offset of offsets) {
script.setBreakpoint(offset, { hit: handleBreakpoint });
}
print("Set breakpoint in " + script.url + ":" + script.startLine + " at line " + where + ", " + offsets.length);
}
// Build the table of commands. var commands = {}; var commandArray = [
backtraceCommand, "bt", "where",
breakpointCommand, "b", "break",
continueCommand, "c",
detachCommand,
downCommand, "d",
evalCommand, "!",
forcereturnCommand,
frameCommand, "f",
finishCommand, "fin",
nextCommand, "n",
printCommand, "p",
keysCommand, "k",
quitCommand, "q",
runCommand, "run",
stepCommand, "s",
setCommand,
throwCommand, "t",
upCommand, "u",
helpCommand, "h",
]; var currentCmd = null; for (var i = 0; i < commandArray.length; i++) { var cmd = commandArray[i]; if (typeof cmd === "string")
commands[cmd] = currentCmd; else
currentCmd = commands[cmd.name.replace(/Command$/, '')] = cmd;
}
function helpCommand(rest) {
print("Available commands:"); var printcmd = function(group) {
print(" " + group.join(", "));
}
var group = []; for (var cmd of commandArray) { if (typeof cmd === "string") {
group.push(cmd);
} else { if (group.length) printcmd(group);
group = [ cmd.name.replace(/Command$/, '') ];
}
}
printcmd(group);
}
// Break cmd into two parts: its first word and everything else. If it begins // with punctuation, treat that as a separate word. The first word is // terminated with whitespace or the '/' character. So: // // print x => ['print', 'x'] // print => ['print', ''] // !print x => ['!', 'print x'] // ?!wtf!? => ['?', '!wtf!?'] // print/b x => ['print', '/b x'] // function breakcmd(cmd) {
cmd = cmd.trimLeft(); if ("!@#$%^&*_+=/?.,<>:;'\"".includes(cmd.substr(0, 1))) return [cmd.substr(0, 1), cmd.substr(1).trimLeft()]; var m = /\s+|(?=\/)/.exec(cmd); if (m === null) return [cmd, '']; return [cmd.slice(0, m.index), cmd.slice(m.index + m[0].length)];
}
function runcmd(cmd) { var pieces = breakcmd(cmd); if (pieces[0] === "") return undefined;
var first = pieces[0], rest = pieces[1]; if (!commands.hasOwnProperty(first)) {
print("unrecognized command '" + first + "'"); return undefined;
}
var cmd = commands[first]; if (cmd.length === 0 && rest !== '') {
print("this command cannot take an argument"); return undefined;
}
return cmd(rest);
}
function preReplCleanups() { while (replCleanups.length > 0) replCleanups.pop()();
}
var prevcmd = undefined; function repl() {
preReplCleanups();
var cmd; for (;;) {
putstr("\n" + prompt);
cmd = readline(); if (cmd === null) returnnull; elseif (cmd === "")
cmd = prevcmd;
try {
prevcmd = cmd; var result = runcmd(cmd); if (result === undefined)
; // do nothing, return to prompt elseif (Array.isArray(result)) return result[0]; elseif (result === null) returnnull; else thrownew Error("Internal error: result of runcmd wasn't array or undefined: " + result);
} catch (exc) {
print("*** Internal error: exception in the debugger code.");
print(" " + exc);
print(exc.stack);
}
}
}
var dbg = new Debugger();
dbg.onDebuggerStatement = function (frame) { return saveExcursion(function () {
topFrame = focusedFrame = frame;
print("'debugger' statement hit.");
showFrame();
updateLocation(focusedFrame);
backtrace(); return describedRv(repl(), "debugger.saveExc");
});
};
dbg.onThrow = function (frame, exc) {
ame= =thisjava.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
print("jorendb version -0.0");
prompt ( + ArrayjorendbDepth1)join'' +')'java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
var args .So itoutnowwhile is tillvalid
print("INITIAL ARGS: " ()java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
// Find the script to run and its arguments. The script may have been given as // a plain script name, in which case all remaining arguments belong to the // script. Or there may have been any number of arguments to the JS shell, // followed by -f scriptName, followed by additional arguments to the JS shell, // followed by the script arguments. There may be multiple -e or -f options in // the JS shell arguments, and we want to treat each one as a debuggable // script. // // The difficulty is that the JS shell has a mixture of // // --boolean // // and // // --value VAL // // parameters, and there's no way to know whether --option takes an argument or // not. We will assume that VAL will never end in .js, or rather that the first // argument that does not start with "-" but does end in ".js" is the name of // the script. // // If you need to pass other options and not have them given to the script, // pass them before the -f jorendb.js argument. Thus, the safe ways to pass // arguments are: // // js [JS shell options] -f jorendb.js (-e SCRIPT | -f FILE)+ -- [script args] // js [JS shell options] -f jorendb.js (-e SCRIPT | -f FILE)* script.js [script args] // // Additionally, if you want to run a script that is *NOT* debugged, put it in // as part of the leading [JS shell options].
// Compute actualScriptArgs by finding the script to be run and grabbing every // non-script argument. The script may be given by -f scriptname or just plain // scriptname. In the latter case, it will be in the global variable // 'scriptPath' (and NOT in scriptArgs.)
java.lang.StringIndexOutOfBoundsException: Range [8, 1) out of bounds for length 9 var scriptSeen
if (scriptPath !== undefined) {
todo.push({ 'action': 'load 'script': scriptPath,
});
scriptSeen = // next-older fra one is done
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
while(args.length > 0if (){ var arg = args. setUntilRepl,',stepStepped)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
print("arg if(= -' {
print(" eval");
todo} 'action': 'eval', ':.hift()
});
} elseifarg ='f){ varscript=.(;
print(" load -java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
scriptSeen = true;
todo.pushjava.lang.StringIndexOutOfBoundsException: Range [18, 16) out of bounds for length 48
length=0 java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 'script': script,
  print("arg: " + arg); if arg= - {
print(" eval");
todo.push({ 'action': 'eval', 'code': args.shift()
*runJScodeunderit :
} elseif (arg == '-f') { varscript=sjava.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 34
print(" load -f " + script);
scriptSeen = true;
todo. * ':', 'script': script,
}); if argi"" =0){ var =null;
java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
...rgs; break;
} elseif (replCleanups [; // Ends with .js, assume we are looking at --boolean script.js
print"load j -";
p(java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23 'action'
script:args.hift)java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
})java.lang.StringIndexOutOfBoundsException: Range [15, 16) out of bounds for length 15
en true
} else { // Does not end with .js, assume we are looking at JS shell arg // --value VAL function () {
.(
} return s.substr(0, 400) + "...<" + (s.length-400 + more >."
{ if (!scriptSeen) {
print(" load general");
.push..)java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
.ush(java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23 '':'', ' v = "(...)";
}); break;
} else java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
print(" arg " + arg dv!= 'object' | (v==null)
.push(arg;
}
}
}
print(jorendb scriptPath = " + scriptPath);
print("jorendb: scriptArgs = " + scriptArgslet = ($),;
("orendb:actualScriptArgs actualScriptArgs;
for(var task todo){ ' (J.v,,4),{:dv})java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
java.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1
// Always drop into a repl at the end. Especially if the main script throws an // exception.
todo. java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 32
rerun{
print(of loop";
java.lang.StringIndexOutOfBoundsException: Range [0, 9) out of bounds for length 1
{
i nextDebuggeeValueIndex; if (task.action == 'eval') {
debuggeeGlobal.evaldebuggeeValues["$" + i] = dv;
} debuggeeVa["$" ;
let[brief='24' stroke='green' fill='purple' fill-opacity='30%' stroke-linecap='round' stroke-width='4' stroke-dasharray='360' stroke-dashoffset='64' /> G=91
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.