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