Skip to content

Commit

Permalink
src: disconnect inspector before exiting out of fatal exception
Browse files Browse the repository at this point in the history
So that coverage, .etc are properly written in case of a normal
fatal exception.

PR-URL: #29611
Fixes: #29570
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: Ben Coe <bencoe@gmail.com>
  • Loading branch information
joyeecheung authored and targos committed Oct 1, 2019
1 parent 8d88010 commit a86b71f
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/node_errors.cc
Original file line number Diff line number Diff line change
Expand Up @@ -980,6 +980,9 @@ void TriggerUncaughtException(Isolate* isolate,

// Now we are certain that the exception is fatal.
ReportFatalException(env, error, message, EnhanceFatalException::kEnhance);
#if HAVE_INSPECTOR
profiler::EndStartedProfilers(env);
#endif

// If the global uncaught exception handler sets process.exitCode,
// exit with that code. Otherwise, exit with 1.
Expand Down
7 changes: 7 additions & 0 deletions test/fixtures/v8-coverage/throw.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const a = 99;
if (true) {
const b = 101;
} else {
const c = 102;
}
throw new Error('test');
18 changes: 18 additions & 0 deletions test/parallel/test-v8-coverage.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,24 @@ function nextdir() {
assert.strictEqual(fixtureCoverage.functions[0].ranges[1].count, 0);
}

// Outputs coverage when error is thrown in first tick.
{
const coverageDirectory = path.join(tmpdir.path, nextdir());
const output = spawnSync(process.execPath, [
require.resolve('../fixtures/v8-coverage/throw')
], { env: { ...process.env, NODE_V8_COVERAGE: coverageDirectory } });
if (output.status !== 1) {
console.log(output.stderr.toString());
}
assert.strictEqual(output.status, 1);
const fixtureCoverage = getFixtureCoverage('throw.js', coverageDirectory);
assert.ok(fixtureCoverage, 'coverage not found for file');
// First branch executed.
assert.strictEqual(fixtureCoverage.functions[0].ranges[0].count, 1);
// Second branch did not execute.
assert.strictEqual(fixtureCoverage.functions[0].ranges[1].count, 0);
}

// Outputs coverage when process.exit(1) exits process.
{
const coverageDirectory = path.join(tmpdir.path, nextdir());
Expand Down

0 comments on commit a86b71f

Please sign in to comment.