mirror of https://github.com/lukechilds/node.git
Browse Source
Currently a debug context is created for various calls to util. If the node debugger is being run the main context is the debug context. In this case node_contextify was freeing the debug context and causing everything to explode. This change moves around the logic and no longer frees the context. There is a concern about the dangling pointer The regression test was adapted from code submitted by @3y3 in #4815 Fixes: https://github.com/nodejs/node/issues/4440 Fixes: https://github.com/nodejs/node/issues/4815 Fixes: https://github.com/nodejs/node/issues/4597 Fixes: https://github.com/nodejs/node/issues/4952 PR-URL: https://github.com/nodejs/node/issues/4815 Reviewed-By: Fedor Indutny <fedor.indutny@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Rich Trott <rtrott@gmail.com>process-exit-stdio-flushing
Myles Borins
9 years ago
3 changed files with 83 additions and 21 deletions
@ -0,0 +1,4 @@ |
|||
'use strict'; |
|||
const util = require('util'); |
|||
const payload = util.inspect({a: 'b'}); |
|||
console.log(payload); |
@ -0,0 +1,69 @@ |
|||
'use strict'; |
|||
const path = require('path'); |
|||
const spawn = require('child_process').spawn; |
|||
const assert = require('assert'); |
|||
|
|||
const common = require('../common'); |
|||
|
|||
const fixture = path.join( |
|||
common.fixturesDir, |
|||
'debugger-util-regression-fixture.js' |
|||
); |
|||
|
|||
const args = [ |
|||
'debug', |
|||
fixture |
|||
]; |
|||
|
|||
const proc = spawn(process.execPath, args, { stdio: 'pipe' }); |
|||
proc.stdout.setEncoding('utf8'); |
|||
proc.stderr.setEncoding('utf8'); |
|||
|
|||
function fail() { |
|||
common.fail('the program should not hang'); |
|||
} |
|||
|
|||
const timer = setTimeout(fail, common.platformTimeout(4000)); |
|||
|
|||
let stdout = ''; |
|||
let stderr = ''; |
|||
|
|||
let nextCount = 0; |
|||
|
|||
proc.stdout.on('data', (data) => { |
|||
stdout += data; |
|||
if (stdout.includes('> 1') && nextCount < 1 || |
|||
stdout.includes('> 2') && nextCount < 2 || |
|||
stdout.includes('> 3') && nextCount < 3 || |
|||
stdout.includes('> 4') && nextCount < 4) { |
|||
nextCount++; |
|||
proc.stdin.write('n\n'); |
|||
} |
|||
else if (stdout.includes('{ a: \'b\' }')) { |
|||
clearTimeout(timer); |
|||
proc.stdin.write('.exit\n'); |
|||
} |
|||
else if (stdout.includes('program terminated')) { |
|||
// Catch edge case present in v4.x
|
|||
// process will terminate after call to util.inspect
|
|||
common.fail('the program should not terminate'); |
|||
} |
|||
}); |
|||
|
|||
proc.stderr.on('data', (data) => stderr += data); |
|||
|
|||
// FIXME
|
|||
// This test has been periodically failing on certain systems due to
|
|||
// uncaught errors on proc.stdin. This will stop the process from
|
|||
// exploding but is still not an elegant solution. Likely a deeper bug
|
|||
// causing this problem.
|
|||
proc.stdin.on('error', (err) => { |
|||
console.error(err); |
|||
}); |
|||
|
|||
process.on('exit', (code) => { |
|||
assert.equal(code, 0, 'the program should exit cleanly'); |
|||
assert.equal(stdout.includes('{ a: \'b\' }'), true, |
|||
'the debugger should print the result of util.inspect'); |
|||
assert.equal(stderr, '', 'stderr should be empty'); |
|||
}); |
Loading…
Reference in new issue