nodejs/lib/internal/inspector_async_hook.js
Ali Ijaz Sheikh 5886e204f0 inspector: track async stacks when necessary
With this change, we do async stack tracking only when explicitly
requested by the inspector client. This avoids unnecessary overhead
for clients that might not be interested in async stack traces.

PR-URL: https://github.com/nodejs/node/pull/16308
Fixes: https://github.com/nodejs/node/issues/16180
Reviewed-By: Eugene Ostroukhov <eostroukhov@google.com>
Reviewed-By: Refael Ackermann <refack@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Timothy Gu <timothygu99@gmail.com>
2017-10-29 09:38:37 -07:00

59 lines
1.5 KiB
JavaScript

'use strict';
const { createHook } = require('async_hooks');
const inspector = process.binding('inspector');
const config = process.binding('config');
if (!inspector || !inspector.asyncTaskScheduled) {
exports.setup = function() {};
return;
}
const hook = createHook({
init(asyncId, type, triggerAsyncId, resource) {
// It's difficult to tell which tasks will be recurring and which won't,
// therefore we mark all tasks as recurring. Based on the discussion
// in https://github.com/nodejs/node/pull/13870#discussion_r124515293,
// this should be fine as long as we call asyncTaskCanceled() too.
const recurring = true;
inspector.asyncTaskScheduled(type, asyncId, recurring);
},
before(asyncId) {
inspector.asyncTaskStarted(asyncId);
},
after(asyncId) {
inspector.asyncTaskFinished(asyncId);
},
destroy(asyncId) {
inspector.asyncTaskCanceled(asyncId);
},
});
function enable() {
if (config.bits < 64) {
// V8 Inspector stores task ids as (void*) pointers.
// async_hooks store ids as 64bit numbers.
// As a result, we cannot reliably translate async_hook ids to V8 async_task
// ids on 32bit platforms.
process.emitWarning(
'Warning: Async stack traces in debugger are not available ' +
`on ${config.bits}bit platforms. The feature is disabled.`,
{
code: 'INSPECTOR_ASYNC_STACK_TRACES_NOT_AVAILABLE',
});
} else {
hook.enable();
}
}
function disable() {
hook.disable();
}
exports.setup = function() {
inspector.registerAsyncHook(enable, disable);
};