1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
'use strict';
const common = require('../common');
common.skipIfInspectorDisabled();
common.skipIfWorker();
const assert = require('assert');
const { Worker } = require('worker_threads');
const { Session } = require('inspector');
const session = new Session();
let done = false;
function onAttachToWorker({ params: { sessionId } }) {
let id = 1;
function postToWorkerInspector(method, params) {
session.post('NodeWorker.sendMessageToWorker', {
sessionId,
message: JSON.stringify({ id: id++, method, params })
}, () => console.log(`Message ${method} received the response`));
}
// Wait for the notification
function onMessageReceived({ params: { message } }) {
if (!message ||
JSON.parse(message).method !== 'NodeRuntime.waitingForDisconnect') {
session.once('NodeWorker.receivedMessageFromWorker', onMessageReceived);
return;
}
// Force a call to node::inspector::Agent::ToggleAsyncHook by changing the
// async call stack depth
postToWorkerInspector('Debugger.setAsyncCallStackDepth', { maxDepth: 1 });
// This is were the original crash happened
session.post('NodeWorker.detach', { sessionId }, () => {
done = true;
});
}
onMessageReceived({ params: { message: null } });
// Enable the debugger, otherwise setAsyncCallStackDepth does nothing
postToWorkerInspector('Debugger.enable');
// Start waiting for disconnect notification
postToWorkerInspector('NodeRuntime.notifyWhenWaitingForDisconnect',
{ enabled: true });
// start worker
postToWorkerInspector('Runtime.runIfWaitingForDebugger');
}
session.connect();
session.on('NodeWorker.attachedToWorker', common.mustCall(onAttachToWorker));
session.post('NodeWorker.enable', { waitForDebuggerOnStart: true }, () => {
new Worker('console.log("Worker is done")', { eval: true })
.once('exit', () => {
setTimeout(() => {
assert.strictEqual(done, true);
console.log('Test is done');
}, 0);
});
});
|