diff --git a/packages/basic.gblib/services/DebuggerService.ts b/packages/basic.gblib/services/DebuggerService.ts index 3164de3e..7c645a4b 100644 --- a/packages/basic.gblib/services/DebuggerService.ts +++ b/packages/basic.gblib/services/DebuggerService.ts @@ -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]; diff --git a/packages/basic.gblib/services/vm2-process/index.ts b/packages/basic.gblib/services/vm2-process/index.ts index 9fb4820f..53e58f61 100644 --- a/packages/basic.gblib/services/vm2-process/index.ts +++ b/packages/basic.gblib/services/vm2-process/index.ts @@ -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); } };