From 25692a985c5c1339e2f9483da58c09ceaa468c2e Mon Sep 17 00:00:00 2001 From: Eugene Ostroukhov Date: Tue, 1 Aug 2017 15:28:51 -0700 Subject: [PATCH] inspector: break in eval script Fixes: https://github.com/nodejs/node/issues/14577 PR-URL: https://github.com/nodejs/node/pull/14581 Reviewed-By: Anna Henningsen Reviewed-By: Benjamin Gruenbaum Reviewed-By: Ruben Bridgewater Reviewed-By: James M Snell --- lib/internal/bootstrap_node.js | 9 +++++++- .../test-async-hook-setup-at-inspect-brk.js | 9 ++++++-- .../test-async-stack-traces-promise-then.js | 11 ++++++---- .../test-async-stack-traces-set-interval.js | 9 +++++++- test/inspector/test-inspector-break-e.js | 22 +++++++++++++++++++ test/inspector/test-scriptparsed-context.js | 4 +--- 6 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 test/inspector/test-inspector-break-e.js diff --git a/lib/internal/bootstrap_node.js b/lib/internal/bootstrap_node.js index 3f83c08354e58f..3ce558611e46e1 100644 --- a/lib/internal/bootstrap_node.js +++ b/lib/internal/bootstrap_node.js @@ -434,6 +434,13 @@ } } + function wrapForBreakOnFirstLine(source) { + if (!process._breakFirstLine) + return source; + const fn = `function() {\n\n${source};\n\n}`; + return `process.binding('inspector').callAndPauseOnStart(${fn}, {})`; + } + function evalScript(name) { const Module = NativeModule.require('module'); const path = NativeModule.require('path'); @@ -442,7 +449,7 @@ const module = new Module(name); module.filename = path.join(cwd, name); module.paths = Module._nodeModulePaths(cwd); - const body = process._eval; + const body = wrapForBreakOnFirstLine(process._eval); const script = `global.__filename = ${JSON.stringify(name)};\n` + 'global.exports = exports;\n' + 'global.module = module;\n' + diff --git a/test/inspector/test-async-hook-setup-at-inspect-brk.js b/test/inspector/test-async-hook-setup-at-inspect-brk.js index 70887ff63d9d4e..7e290605522a39 100644 --- a/test/inspector/test-async-hook-setup-at-inspect-brk.js +++ b/test/inspector/test-async-hook-setup-at-inspect-brk.js @@ -13,9 +13,14 @@ setTimeout(() => { }, 50); `; +async function skipBreakpointAtStart(session) { + await session.waitForBreakOnLine(0, '[eval]'); + await session.send({ 'method': 'Debugger.resume' }); +} + async function checkAsyncStackTrace(session) { console.error('[test]', 'Verify basic properties of asyncStackTrace'); - const paused = await session.waitForBreakOnLine(2, '[eval]'); + const paused = await session.waitForBreakOnLine(4, '[eval]'); assert(paused.params.asyncStackTrace, `${Object.keys(paused.params)} contains "asyncStackTrace" property`); assert(paused.params.asyncStackTrace.description, 'Timeout'); @@ -35,7 +40,7 @@ async function runTests() { 'params': { 'patterns': [] } }, { 'method': 'Runtime.runIfWaitingForDebugger' } ]); - + await skipBreakpointAtStart(session); await checkAsyncStackTrace(session); await session.runToCompletion(); diff --git a/test/inspector/test-async-stack-traces-promise-then.js b/test/inspector/test-async-stack-traces-promise-then.js index 68584b0a3c5dad..9e28d0d51e3a55 100644 --- a/test/inspector/test-async-stack-traces-promise-then.js +++ b/test/inspector/test-async-stack-traces-promise-then.js @@ -31,15 +31,18 @@ async function runTests() { { 'method': 'Runtime.runIfWaitingForDebugger' } ]); + await session.waitForBreakOnLine(0, '[eval]'); + await session.send({ 'method': 'Debugger.resume' }); + console.error('[test] Waiting for break1'); - debuggerPausedAt(await session.waitForBreakOnLine(4, '[eval]'), - 'break1', 'runTest:3'); + debuggerPausedAt(await session.waitForBreakOnLine(6, '[eval]'), + 'break1', 'runTest:5'); await session.send({ 'method': 'Debugger.resume' }); console.error('[test] Waiting for break2'); - debuggerPausedAt(await session.waitForBreakOnLine(7, '[eval]'), - 'break2', 'runTest:6'); + debuggerPausedAt(await session.waitForBreakOnLine(9, '[eval]'), + 'break2', 'runTest:8'); await session.runToCompletion(); assert.strictEqual(0, (await instance.expectShutdown()).exitCode); diff --git a/test/inspector/test-async-stack-traces-set-interval.js b/test/inspector/test-async-stack-traces-set-interval.js index bc96df9588fc6a..78f7a8e980e3b4 100644 --- a/test/inspector/test-async-stack-traces-set-interval.js +++ b/test/inspector/test-async-stack-traces-set-interval.js @@ -8,9 +8,15 @@ const assert = require('assert'); const script = 'setInterval(() => { debugger; }, 50);'; +async function skipFirstBreakpoint(session) { + console.log('[test]', 'Skipping the first breakpoint in the eval script'); + await session.waitForBreakOnLine(0, '[eval]'); + await session.send({ 'method': 'Debugger.resume' }); +} + async function checkAsyncStackTrace(session) { console.error('[test]', 'Verify basic properties of asyncStackTrace'); - const paused = await session.waitForBreakOnLine(0, '[eval]'); + const paused = await session.waitForBreakOnLine(2, '[eval]'); assert(paused.params.asyncStackTrace, `${Object.keys(paused.params)} contains "asyncStackTrace" property`); assert(paused.params.asyncStackTrace.description, 'Timeout'); @@ -31,6 +37,7 @@ async function runTests() { { 'method': 'Runtime.runIfWaitingForDebugger' } ]); + await skipFirstBreakpoint(session); await checkAsyncStackTrace(session); console.error('[test]', 'Stopping child instance'); diff --git a/test/inspector/test-inspector-break-e.js b/test/inspector/test-inspector-break-e.js new file mode 100644 index 00000000000000..0e5b837bc51298 --- /dev/null +++ b/test/inspector/test-inspector-break-e.js @@ -0,0 +1,22 @@ +'use strict'; +const common = require('../common'); + +common.skipIfInspectorDisabled(); + +const assert = require('assert'); +const { NodeInstance } = require('./inspector-helper.js'); + +async function runTests() { + const instance = new NodeInstance(undefined, 'console.log(10)'); + const session = await instance.connectInspectorSession(); + await session.send([ + { 'method': 'Runtime.enable' }, + { 'method': 'Debugger.enable' }, + { 'method': 'Runtime.runIfWaitingForDebugger' } + ]); + await session.waitForBreakOnLine(0, '[eval]'); + await session.runToCompletion(); + assert.strictEqual(0, (await instance.expectShutdown()).exitCode); +} + +runTests(); diff --git a/test/inspector/test-scriptparsed-context.js b/test/inspector/test-scriptparsed-context.js index f1258639f5d7ab..6e89f05dc63491 100644 --- a/test/inspector/test-scriptparsed-context.js +++ b/test/inspector/test-scriptparsed-context.js @@ -10,8 +10,6 @@ const script = ` const assert = require('assert'); const vm = require('vm'); const { kParsingContext } = process.binding('contextify'); - debugger; - global.outer = true; global.inner = false; const context = vm.createContext({ @@ -61,7 +59,7 @@ async function runTests() { { 'method': 'Debugger.enable' }, { 'method': 'Runtime.runIfWaitingForDebugger' } ]); - await session.waitForBreakOnLine(5, '[eval]'); + await session.waitForBreakOnLine(0, '[eval]'); await session.send({ 'method': 'Runtime.enable' }); const topContext = await getContext(session);