1'use strict'; 2 3// This tests that tracing can be enabled dynamically with the 4// trace_events module. 5 6const common = require('../common'); 7try { 8 require('trace_events'); 9} catch { 10 common.skip('missing trace events'); 11} 12 13const assert = require('assert'); 14const cp = require('child_process'); 15const fs = require('fs'); 16const path = require('path'); 17 18const enable = `require("trace_events").createTracing( 19{ categories: ["node.async_hooks"] }).enable();`; 20const code = 21 'setTimeout(() => { for (let i = 0; i < 100000; i++) { "test" + i } }, 1)'; 22 23const tmpdir = require('../common/tmpdir'); 24const filename = path.join(tmpdir.path, 'node_trace.1.log'); 25 26tmpdir.refresh(); 27const proc = cp.spawnSync( 28 process.execPath, 29 ['-e', enable + code ], 30 { 31 cwd: tmpdir.path, 32 env: { ...process.env, 33 'NODE_DEBUG_NATIVE': 'tracing', 34 'NODE_DEBUG': 'tracing' } 35 }); 36 37console.log('process exit with signal:', proc.signal); 38console.log('process stderr:', proc.stderr.toString()); 39 40assert.strictEqual(proc.status, 0); 41assert(fs.existsSync(filename)); 42const data = fs.readFileSync(filename, 'utf-8'); 43const traces = JSON.parse(data).traceEvents; 44 45function filterTimeoutTraces(trace) { 46 if (trace.pid !== proc.pid) 47 return false; 48 if (trace.cat !== 'node,node.async_hooks') 49 return false; 50 if (trace.name !== 'Timeout') 51 return false; 52 return true; 53} 54 55{ 56 const timeoutTraces = traces.filter(filterTimeoutTraces); 57 assert.notDeepStrictEqual(timeoutTraces, []); 58 const threads = new Set(); 59 for (const trace of timeoutTraces) { 60 threads.add(trace.tid); 61 } 62 assert.notDeepStrictEqual(timeoutTraces, []); 63} 64