Browse Source

test: work around debugger not killing inferior

On UNIX platforms, the debugger doesn't reliably kill the inferior when
killed by a signal.  Work around that by spawning the debugger in its
own process group and killing the process group instead of just the
debugger process.

This is a hack to get the continuous integration back to green, it
doesn't address the underlying issue, which is that the debugger
shouldn't leave stray processes behind.

Fixes: https://github.com/nodejs/node/issues/7034
PR-URL: https://github.com/nodejs/node/pull/7037
Refs: https://github.com/nodejs/node/pull/3470
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
v6.x
Ben Noordhuis 9 years ago
committed by Rod Vagg
parent
commit
e4ac808c4d
  1. 21
      test/parallel/test-debug-port-numbers.js

21
test/parallel/test-debug-port-numbers.js

@ -5,11 +5,17 @@ const assert = require('assert');
const path = require('path'); const path = require('path');
const spawn = require('child_process').spawn; const spawn = require('child_process').spawn;
// FIXME(bnoordhuis) On UNIX platforms, the debugger doesn't reliably kill
// the inferior when killed by a signal. Work around that by spawning
// the debugger in its own process group and killing the process group
// instead of just the debugger process.
const detached = !common.isWindows;
const children = []; const children = [];
for (let i = 0; i < 4; i += 1) { for (let i = 0; i < 4; i += 1) {
const port = common.PORT + i; const port = common.PORT + i;
const args = [`--debug-port=${port}`, '--interactive', 'debug', __filename]; const args = [`--debug-port=${port}`, '--interactive', 'debug', __filename];
const child = spawn(process.execPath, args, { stdio: 'pipe' }); const child = spawn(process.execPath, args, { detached, stdio: 'pipe' });
child.test = { port: port, stdout: '' }; child.test = { port: port, stdout: '' };
child.stdout.setEncoding('utf8'); child.stdout.setEncoding('utf8');
child.stdout.on('data', function(s) { child.test.stdout += s; update(); }); child.stdout.on('data', function(s) { child.test.stdout += s; update(); });
@ -28,7 +34,18 @@ function update() {
if (ready === children.length) if (ready === children.length)
for (const child of children) for (const child of children)
child.kill(); kill(child);
}
function kill(child) {
if (!detached)
return child.kill();
try {
process.kill(-child.pid); // Kill process group.
} catch (e) {
assert.strictEqual(e.code, 'ESRCH'); // Already gone.
}
} }
process.on('exit', function() { process.on('exit', function() {

Loading…
Cancel
Save