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 }); 37 38console.log('process exit with signal:', proc.signal); 39console.log('process stderr:', proc.stderr.toString()); 40 41assert.strictEqual(proc.status, 0); 42assert(fs.existsSync(filename)); 43const data = fs.readFileSync(filename, 'utf-8'); 44const traces = JSON.parse(data).traceEvents; 45 46function filterTimeoutTraces(trace) { 47 if (trace.pid !== proc.pid) 48 return false; 49 if (trace.cat !== 'node,node.async_hooks') 50 return false; 51 if (trace.name !== 'Timeout') 52 return false; 53 return true; 54} 55 56{ 57 const timeoutTraces = traces.filter(filterTimeoutTraces); 58 assert.notDeepStrictEqual(timeoutTraces, []); 59 const threads = new Set(); 60 for (const trace of timeoutTraces) { 61 threads.add(trace.tid); 62 } 63 assert.notDeepStrictEqual(timeoutTraces, []); 64} 65