Vm3 alpha debugger #295
2 changed files with 26 additions and 5 deletions
|
@ -197,12 +197,13 @@ export class DebuggerService {
|
|||
GBServer.globals.debuggers[botId] = {};
|
||||
GBServer.globals.debuggers[botId].state = 0;
|
||||
GBServer.globals.debuggers[botId].breaks = [];
|
||||
GBServer.globals.debuggers[botId].stateInfo = "Stopped";
|
||||
}
|
||||
|
||||
private client;
|
||||
|
||||
public async breakpoint({ botId, botApiKey, line }) {
|
||||
GBLog.info(`GBDEBUG: Enabled breakpoint for ${botId} on ${line}.`);
|
||||
GBLog.info(`BASIC: Enabled breakpoint for ${botId} on ${line}.`);
|
||||
GBServer.globals.debuggers[botId].breaks.push(Number.parseInt(line));
|
||||
}
|
||||
|
||||
|
@ -211,6 +212,7 @@ export class DebuggerService {
|
|||
const client = GBServer.globals.debuggers[botId].client;
|
||||
await client.Debugger.resume();
|
||||
GBServer.globals.debuggers[botId].state = 1;
|
||||
GBServer.globals.debuggers[botId].stateInfo = "Running (Debug)";
|
||||
return {status: 'OK'};
|
||||
} else {
|
||||
const error = 'Invalid call to resume and state not being debug(2).';
|
||||
|
@ -220,6 +222,7 @@ export class DebuggerService {
|
|||
|
||||
public async stop({ botId, botApiKey, force }) {
|
||||
GBServer.globals.debuggers[botId].state = 0;
|
||||
GBServer.globals.debuggers[botId].stateInfo = "Stopped";
|
||||
const client = GBServer.globals.debuggers[botId].client;
|
||||
await client.Debugger.close();
|
||||
return {status: 'OK'};
|
||||
|
@ -227,6 +230,7 @@ export class DebuggerService {
|
|||
|
||||
public async step({ botId, botApiKey }) {
|
||||
if (GBServer.globals.debuggers[botId].state === 2) {
|
||||
GBServer.globals.debuggers[botId].stateInfo = "Break";
|
||||
const client = GBServer.globals.debuggers[botId].client;
|
||||
await client.Debugger.stepOver();
|
||||
return {status: 'OK'};
|
||||
|
@ -263,8 +267,9 @@ export class DebuggerService {
|
|||
return {
|
||||
status: 'OK',
|
||||
state: GBServer.globals.debuggers[botId].state,
|
||||
messagesText,
|
||||
scope: GBServer.globals.debuggers[botId].scope
|
||||
messages:messagesText,
|
||||
scope: GBServer.globals.debuggers[botId].scope,
|
||||
scopeInfo: GBServer.globals.debuggers[botId].stateInfo
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -279,8 +284,8 @@ export class DebuggerService {
|
|||
return {status: 'OK'};
|
||||
} else {
|
||||
GBLog.info(`BASIC: Running ${botId} in DEBUG mode.`);
|
||||
|
||||
GBServer.globals.debuggers[botId].state = 1;
|
||||
GBServer.globals.debuggers[botId].stateInfo = "Running (Debug)";
|
||||
|
||||
let min: GBMinInstance = GBServer.globals.minInstances.filter(p => p.instance.botId === botId)[0];
|
||||
|
||||
|
|
|
@ -72,10 +72,14 @@ const createVm2Pool = ({ min, max, ...limits }) => {
|
|||
if (stderrCache.includes('failed: address already in use')) {
|
||||
limitError = stderrCache;
|
||||
kill(process);
|
||||
GBServer.globals.debuggers[limits.botId].state = 0;
|
||||
GBServer.globals.debuggers[limits.botId].stateInfo = stderrCache;
|
||||
}
|
||||
if (stderrCache.includes('FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory')) {
|
||||
limitError = 'code execution exceeed allowed memory';
|
||||
kill(process);
|
||||
GBServer.globals.debuggers[limits.botId].state = 0;
|
||||
GBServer.globals.debuggers[limits.botId].stateInfo = "Fail";
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -120,8 +124,9 @@ const createVm2Pool = ({ min, max, ...limits }) => {
|
|||
GBLog.info(`BASIC: Break at line ${frame.location.lineNumber + 1}`); // (zero-based)
|
||||
|
||||
GBServer.globals.debuggers[limits.botId].state = 2;
|
||||
GBServer.globals.debuggers[limits.botId].stateInfo = "Break";
|
||||
} else {
|
||||
GBLog.info(`BASIC: Configuring breakpoints if any for ${limits.botId}`);
|
||||
GBLog.verbose(`BASIC: Configuring breakpoints if any for ${limits.botId}...`);
|
||||
// Waits for debugger and setup breakpoints.
|
||||
|
||||
await CollectionUtil.asyncForEach(GBServer.globals.debuggers[limits.botId].breaks, async brk => {
|
||||
|
@ -149,10 +154,14 @@ const createVm2Pool = ({ min, max, ...limits }) => {
|
|||
} catch (err) {
|
||||
GBLog.error(err);
|
||||
kill(childProcess);
|
||||
GBServer.globals.debuggers[limits.botId].state = 0;
|
||||
GBServer.globals.debuggers[limits.botId].stateInfo = "Stopped";
|
||||
}
|
||||
}).on('error', err => {
|
||||
console.error(err);
|
||||
kill(childProcess);
|
||||
GBServer.globals.debuggers[limits.botId].state = 0;
|
||||
GBServer.globals.debuggers[limits.botId].stateInfo = "Stopped";
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
|
@ -163,13 +172,17 @@ const createVm2Pool = ({ min, max, ...limits }) => {
|
|||
|
||||
const timer = setTimeout(() => {
|
||||
limitError = 'code execution took too long and was killed';
|
||||
|
||||
kill(childProcess);
|
||||
GBServer.globals.debuggers[limits.botId].state = 0;
|
||||
GBServer.globals.debuggers[limits.botId].stateInfo = limitError;
|
||||
}, limits.time);
|
||||
|
||||
try {
|
||||
let data = await finalStream(socket);
|
||||
|
||||
data = JSON.parse(data);
|
||||
|
||||
if (!data.length) {
|
||||
return null;
|
||||
}
|
||||
|
@ -182,6 +195,9 @@ const createVm2Pool = ({ min, max, ...limits }) => {
|
|||
throw new Error(limitError || error);
|
||||
} finally {
|
||||
kill(childProcess);
|
||||
|
||||
GBServer.globals.debuggers[limits.botId].state = 0;
|
||||
GBServer.globals.debuggers[limits.botId].stateInfo = 'Stopped';
|
||||
clearTimeout(timer);
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue