Skip to content

Commit 77d19fe

Browse files
committed
debugger: wait for initial break output
Wait for the initial pause render before completing debugger REPL startup. This prevents the prompt from being displayed before the initial break location has been printed. Signed-off-by: Kamat, Trivikram <16024985+trivikr@users.noreply.github.com> Assisted-by: openai:gpt-5.5
1 parent 1a33a8c commit 77d19fe

1 file changed

Lines changed: 23 additions & 2 deletions

File tree

lib/internal/debugger/inspect_repl.js

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const {
2525
Promise,
2626
PromisePrototypeThen,
2727
PromiseResolve,
28+
PromiseWithResolvers,
2829
ReflectGetOwnPropertyDescriptor,
2930
ReflectOwnKeys,
3031
RegExpPrototypeExec,
@@ -380,6 +381,7 @@ function createRepl(inspector) {
380381
let selectedFrame;
381382
let exitDebugRepl;
382383
let contextLineNumber = 2;
384+
let initialBreakRender;
383385

384386
function resetOnStart() {
385387
knownScripts = {};
@@ -890,6 +892,17 @@ function createRepl(inspector) {
890892
});
891893
}
892894

895+
function createInitialBreakRenderPromise() {
896+
if (!inspector.options.script ||
897+
process.env.NODE_INSPECT_RESUME_ON_START === '1') {
898+
return null;
899+
}
900+
901+
const { promise, resolve, reject } = PromiseWithResolvers();
902+
initialBreakRender = { resolve, reject };
903+
return promise;
904+
}
905+
893906
Debugger.on('paused', ({ callFrames, reason /* , hitBreakpoints */ }) => {
894907
if (process.env.NODE_INSPECT_RESUME_ON_START === '1' &&
895908
reason === 'Break on start') {
@@ -910,7 +923,7 @@ function createRepl(inspector) {
910923

911924
const header = `${breakType} in ${scriptUrl}:${lineNumber + 1}`;
912925

913-
inspector.suspendReplWhile(() =>
926+
const pauseRender = inspector.suspendReplWhile(() =>
914927
PromisePrototypeThen(
915928
SafePromiseAllReturnArrayLike([formatWatchers(true), selectedFrame.list(contextLineNumber)]),
916929
({ 0: watcherList, 1: context }) => {
@@ -919,6 +932,12 @@ function createRepl(inspector) {
919932
inspect(context);
920933
print(`${header}\n${breakContext}`);
921934
}));
935+
936+
if (initialBreakRender) {
937+
const { resolve, reject } = initialBreakRender;
938+
initialBreakRender = null;
939+
PromisePrototypeThen(pauseRender, resolve, reject);
940+
}
922941
});
923942

924943
function handleResumed() {
@@ -1186,6 +1205,7 @@ function createRepl(inspector) {
11861205
}
11871206

11881207
async function initAfterStart() {
1208+
const initialBreakRenderPromise = createInitialBreakRenderPromise();
11891209
await Runtime.enable();
11901210
await Profiler.enable();
11911211
await Profiler.setSamplingInterval({ interval: 100 });
@@ -1194,7 +1214,8 @@ function createRepl(inspector) {
11941214
await Debugger.setBlackboxPatterns({ patterns: [] });
11951215
await Debugger.setPauseOnExceptions({ state: pauseOnExceptionState });
11961216
await restoreBreakpoints();
1197-
return Runtime.runIfWaitingForDebugger();
1217+
await Runtime.runIfWaitingForDebugger();
1218+
await initialBreakRenderPromise;
11981219
}
11991220

12001221
return async function startRepl() {

0 commit comments

Comments
 (0)