From 31468d3c6689046e3c9326ff43290aa866dd3da1 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Mon, 6 Jul 2026 23:04:20 +0200 Subject: [PATCH] test: normalize Windows crash in debugger test normalization The inspector can crash on teardown when the debuggee exits quickly, previously we ignored it for debugger tests as that's likely an upstream issue unrelated to Node.js's own debugger utilities, but the detection only matches patternsf on UNIX-y platforms. On Windows this manifests as exit code 3221225477 (0xC0000005 STATUS_ACCESS_VIOLATION) instead of SIGSEGV. Extend the helper to recognize and normalize both variants. Signed-off-by: Joyee Cheung --- test/common/debugger-probe.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/test/common/debugger-probe.js b/test/common/debugger-probe.js index 58ecfc24055dad..b8302de36957c9 100644 --- a/test/common/debugger-probe.js +++ b/test/common/debugger-probe.js @@ -4,25 +4,33 @@ const assert = require('assert'); const { spawnSyncAndExit } = require('./child_process'); // Work around a pre-existing inspector issue: if the debuggee exits too quickly -// the inspector can segfault while tearing down. For now normalize the segfault +// the inspector can crash while tearing down. For now normalize the crash // back to the expected terminal event (e.g. "completed" or "miss") // until the upstream bug is fixed. // See https://github.com/nodejs/node/issues/62765 // https://github.com/nodejs/node/issues/58245 +// The crash shows up as with exit code 3221225477 on Windows, or signal +// SIGSEGV on other platforms. const probeTargetExitSignal = 'SIGSEGV'; +// 0xC0000005 STATUS_ACCESS_VIOLATION on Windows +const probeTargetExitCode = 3221225477; function isProbeSegvTeardown(result) { if (result?.event !== 'error') { return false; } const error = result.error; - if (error?.signal !== probeTargetExitSignal) { return false; } + if (error?.signal !== probeTargetExitSignal && error?.exitCode !== probeTargetExitCode) { return false; } return error.code === 'probe_target_exit' || error.code === 'probe_failure'; } function findProbeSegvTeardownLine(output) { const signalPrefix = `Target exited with signal ${probeTargetExitSignal}`; - if (output.startsWith(signalPrefix)) { return 0; } - const idx = output.indexOf(`\n${signalPrefix}`); - return idx === -1 ? -1 : idx + 1; + const codePrefix = `Target exited with code ${probeTargetExitCode}`; + for (const prefix of [signalPrefix, codePrefix]) { + if (output.startsWith(prefix)) { return 0; } + const idx = output.indexOf(`\n${prefix}`); + if (idx !== -1) { return idx + 1; } + } + return -1; } // Replace volatile fields in a probe report (stack frames, Node.js version,