From 2d5fb4e2cc06f7cae67274d9a20a72f057d5dcf6 Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Mon, 5 Feb 2024 13:21:41 -0700 Subject: [PATCH] report: add `--report-network-disabled` option Adds a new option `process.report.networkDisabled` and cli option `--report-network-disabled` which will disable any netowkring operations for the `report` generation. Fixes: #46060 --- doc/api/report.md | 12 +++++++ lib/internal/process/report.js | 7 ++++ src/node_options.cc | 6 ++++ src/node_options.h | 2 ++ src/node_report.cc | 34 +++++++++++++----- src/node_report_module.cc | 17 +++++++++ test/cctest/test_report.cc | 1 + test/report/test-report-config.js | 11 ++++++ test/report/test-report-disable-network.js | 41 ++++++++++++++++++++++ test/report/test-report.json | 1 + 10 files changed, 123 insertions(+), 9 deletions(-) create mode 100644 test/report/test-report-disable-network.js create mode 100644 test/report/test-report.json diff --git a/doc/api/report.md b/doc/api/report.md index 213f7126960027..a1fcd4b1b1fa88 100644 --- a/doc/api/report.md +++ b/doc/api/report.md @@ -8,6 +8,10 @@ + + Delivers a JSON-formatted diagnostic summary, written to a file. The report is intended for development, test, and production use, to capture @@ -452,6 +456,9 @@ meaning of `SIGUSR2` for the said purposes. * `--report-signal` Sets or resets the signal for report generation (not supported on Windows). Default signal is `SIGUSR2`. +* `--report-network-disabled` Disable the `header.networkInterfaces` reporting. + Default is `false`. + A report can also be triggered via an API call from a JavaScript application: ```js @@ -571,6 +578,8 @@ timestamp, PID, and sequence number. written. URLs are not supported. Defaults to the current working directory of the Node.js process. +`networkDisabled` disables the `header.networkInterfaces` reporting. + ```js // Trigger report only on uncaught exceptions. process.report.reportOnFatalError = false; @@ -587,6 +596,9 @@ process.report.reportOnFatalError = false; process.report.reportOnUncaughtException = false; process.report.reportOnSignal = true; process.report.signal = 'SIGQUIT'; + +// Disable network interfaces reporting +process.report.networkDisabled = true; ``` Configuration on module initialization is also available via diff --git a/lib/internal/process/report.js b/lib/internal/process/report.js index 9889f913c3f81f..87cd79fe29e866 100644 --- a/lib/internal/process/report.js +++ b/lib/internal/process/report.js @@ -60,6 +60,13 @@ const report = { validateBoolean(b, 'compact'); nr.setCompact(b); }, + get networkDisabled() { + return nr.getNetworkDisabled(); + }, + set networkDisabled(b) { + validateBoolean(b, 'networkDisabled'); + nr.setNetworkDisabled(b); + }, get signal() { return nr.getSignal(); }, diff --git a/src/node_options.cc b/src/node_options.cc index 7b5152172c5ce7..62231dad02e580 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -785,6 +785,12 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { "set default TLS maximum to TLSv1.3 (default: TLSv1.3)", &EnvironmentOptions::tls_max_v1_3, kAllowedInEnvvar); + + AddOption("--report-network-disabled", + "disable network interface diagnostics." + " (default: false)", + &EnvironmentOptions::report_network_disabled, + kAllowedInEnvvar); } PerIsolateOptionsParser::PerIsolateOptionsParser( diff --git a/src/node_options.h b/src/node_options.h index 915151b7dc2904..c6ce47e008e578 100644 --- a/src/node_options.h +++ b/src/node_options.h @@ -218,6 +218,8 @@ class EnvironmentOptions : public Options { std::vector user_argv; + bool report_network_disabled = false; + inline DebugOptions* get_debug_options() { return &debug_options_; } inline const DebugOptions& debug_options() const { return debug_options_; } diff --git a/src/node_report.cc b/src/node_report.cc index 54121cb6b48210..da87567a39f664 100644 --- a/src/node_report.cc +++ b/src/node_report.cc @@ -61,8 +61,10 @@ static void WriteNodeReport(Isolate* isolate, const std::string& filename, std::ostream& out, Local error, - bool compact); -static void PrintVersionInformation(JSONWriter* writer); + bool compact, + bool network_disabled = false); +static void PrintVersionInformation(JSONWriter* writer, + bool network_disabled = false); static void PrintJavaScriptErrorStack(JSONWriter* writer, Isolate* isolate, Local error, @@ -93,7 +95,8 @@ static void WriteNodeReport(Isolate* isolate, const std::string& filename, std::ostream& out, Local error, - bool compact) { + bool compact, + bool network_disabled) { // Obtain the current time and the pid. TIME_TYPE tm_struct; DiagnosticFilename::LocalTime(&tm_struct); @@ -174,7 +177,7 @@ static void WriteNodeReport(Isolate* isolate, } // Report Node.js and OS version information - PrintVersionInformation(&writer); + PrintVersionInformation(&writer, network_disabled); writer.json_objectend(); if (isolate != nullptr) { @@ -256,7 +259,7 @@ static void WriteNodeReport(Isolate* isolate, } // Report Node.js version, OS version and machine information. -static void PrintVersionInformation(JSONWriter* writer) { +static void PrintVersionInformation(JSONWriter* writer, bool network_disabled) { std::ostringstream buf; // Report Node version buf << "v" << NODE_VERSION_STRING; @@ -300,7 +303,8 @@ static void PrintVersionInformation(JSONWriter* writer) { } PrintCpuInfo(writer); - PrintNetworkInterfaceInfo(writer); + if (!network_disabled) + PrintNetworkInterfaceInfo(writer); char host[UV_MAXHOSTNAMESIZE]; size_t host_size = sizeof(host); @@ -917,8 +921,18 @@ std::string TriggerNodeReport(Isolate* isolate, compact = per_process::cli_options->report_compact; } + bool network_disabled = env->options()->report_network_disabled; + report::WriteNodeReport( - isolate, env, message, trigger, filename, *outstream, error, compact); + isolate, + env, + message, + trigger, + filename, + *outstream, + error, + compact, + network_disabled); // Do not close stdout/stderr, only close files we opened. if (outfile.is_open()) { @@ -969,8 +983,9 @@ void GetNodeReport(Isolate* isolate, if (isolate != nullptr) { env = Environment::GetCurrent(isolate); } + bool network_disabled = env->options()->report_network_disabled; report::WriteNodeReport( - isolate, env, message, trigger, "", out, error, false); + isolate, env, message, trigger, "", out, error, false, network_disabled); } // External function to trigger a report, writing to a supplied stream. @@ -983,8 +998,9 @@ void GetNodeReport(Environment* env, if (env != nullptr) { isolate = env->isolate(); } + bool network_disabled = env->options()->report_network_disabled; report::WriteNodeReport( - isolate, env, message, trigger, "", out, error, false); + isolate, env, message, trigger, "", out, error, false, network_disabled); } } // namespace node diff --git a/src/node_report_module.cc b/src/node_report_module.cc index 58963fd5150b04..13aa93aef4db0a 100644 --- a/src/node_report_module.cc +++ b/src/node_report_module.cc @@ -84,6 +84,19 @@ static void SetCompact(const FunctionCallbackInfo& info) { per_process::cli_options->report_compact = compact; } +static void GetNetworkDisabled(const FunctionCallbackInfo& info) { + Environment* env = Environment::GetCurrent(info); + info.GetReturnValue().Set(env->options()->report_network_disabled); +} + +static void SetNetworkDisabled(const FunctionCallbackInfo& info) { + Mutex::ScopedLock lock(per_process::cli_options_mutex); + Environment* env = Environment::GetCurrent(info); + Isolate* isolate = env->isolate(); + env->options()->report_network_disabled + = info[0]->ToBoolean(isolate)->Value(); +} + static void GetDirectory(const FunctionCallbackInfo& info) { Mutex::ScopedLock lock(per_process::cli_options_mutex); Environment* env = Environment::GetCurrent(info); @@ -174,6 +187,8 @@ static void Initialize(Local exports, SetMethod(context, exports, "getReport", GetReport); SetMethod(context, exports, "getCompact", GetCompact); SetMethod(context, exports, "setCompact", SetCompact); + SetMethod(context, exports, "getNetworkDisabled", GetNetworkDisabled); + SetMethod(context, exports, "setNetworkDisabled", SetNetworkDisabled); SetMethod(context, exports, "getDirectory", GetDirectory); SetMethod(context, exports, "setDirectory", SetDirectory); SetMethod(context, exports, "getFilename", GetFilename); @@ -200,6 +215,8 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(GetReport); registry->Register(GetCompact); registry->Register(SetCompact); + registry->Register(GetNetworkDisabled); + registry->Register(SetNetworkDisabled); registry->Register(GetDirectory); registry->Register(SetDirectory); registry->Register(GetFilename); diff --git a/test/cctest/test_report.cc b/test/cctest/test_report.cc index 82c5c4e538dae4..27126b63f68618 100644 --- a/test/cctest/test_report.cc +++ b/test/cctest/test_report.cc @@ -1,4 +1,5 @@ #include "node.h" +#include "node_report.h" #include #include "gtest/gtest.h" diff --git a/test/report/test-report-config.js b/test/report/test-report-config.js index dce58c5bfcd954..f3dd8b1bc28b94 100644 --- a/test/report/test-report-config.js +++ b/test/report/test-report-config.js @@ -66,6 +66,17 @@ assert.throws(() => { }, { code: 'ERR_INVALID_ARG_TYPE' }); assert.strictEqual(process.report.compact, true); +// Verify that process.report.networkDisabled behaves properly. +assert.strictEqual(process.report.networkDisabled, false); +process.report.networkDisabled = true; +assert.strictEqual(process.report.networkDisabled, true); +process.report.networkDisabled = false; +assert.strictEqual(process.report.networkDisabled, false); +assert.throws(() => { + process.report.networkDisabled = {}; +}, { code: 'ERR_INVALID_ARG_TYPE' }); +assert.strictEqual(process.report.networkDisabled, false); + if (!common.isWindows) { // Verify that process.report.signal behaves properly. assert.strictEqual(process.report.signal, 'SIGUSR2'); diff --git a/test/report/test-report-disable-network.js b/test/report/test-report-disable-network.js new file mode 100644 index 00000000000000..33ef655b481df0 --- /dev/null +++ b/test/report/test-report-disable-network.js @@ -0,0 +1,41 @@ +'use strict'; +require('../common'); +const assert = require('node:assert'); +const { spawnSync } = require('node:child_process'); +const tmpdir = require('../common/tmpdir'); +const { describe, it, before } = require('node:test'); +const fs = require('node:fs'); +const helper = require('../common/report'); + +function validate(pid) { + const reports = helper.findReports(pid, tmpdir.path); + assert.strictEqual(reports.length, 1); + let report = fs.readFileSync(reports[0], { encoding: 'utf8' }); + report = JSON.parse(report); + assert.strictEqual(report.header.networkInterfaces, undefined); + fs.unlinkSync(reports[0]); +} + +describe('report network disabled option', () => { + before(() => { + tmpdir.refresh(); + process.report.directory = tmpdir.path; + }); + + it('should be configurable with --report-network-disabled', () => { + const args = ['--report-network-disabled', '-e', 'process.report.writeReport()']; + const child = spawnSync(process.execPath, args, { cwd: tmpdir.path }); + assert.strictEqual(child.status, 0); + assert.strictEqual(child.signal, null); + validate(child.pid); + }); + + it('should be configurable with report.networkDisabled', () => { + process.report.networkDisabled = true; + process.report.writeReport(); + validate(process.pid); + + const report = process.report.getReport(); + assert.strictEqual(report.header.networkInterfaces, undefined); + }); +}); diff --git a/test/report/test-report.json b/test/report/test-report.json new file mode 100644 index 00000000000000..da2e1a65be3bed --- /dev/null +++ b/test/report/test-report.json @@ -0,0 +1 @@ +{"header":{"reportVersion":3,"event":"Exception","trigger":"Exception","filename":"test-report.json","dumpEventTime":"2024-02-05T08:34:20Z","dumpEventTimeStamp":"1707147260573","processId":11830,"threadId":0,"cwd":"/Users/ethanarrowood/Documents/github/nodejs/node","commandLine":["out/Release/node","--report-on-fatalerror","--report-on-signal","--report-uncaught-exception","--report-compact","/Users/ethanarrowood/Documents/github/nodejs/node/test/report/test-report-config.js"],"nodejsVersion":"v22.0.0-pre","wordSize":64,"arch":"arm64","platform":"darwin","componentVersions":{"acorn":"8.11.3","ada":"2.7.6","ares":"1.25.0","base64":"0.5.2","brotli":"1.1.0","cjs_module_lexer":"1.2.2","cldr":"44.0","icu":"74.1","llhttp":"9.1.3","modules":"122","napi":"9","nghttp2":"1.59.0","nghttp3":"0.7.0","ngtcp2":"1.2.0","node":"22.0.0-pre","openssl":"3.0.12+quic","simdjson":"3.6.3","simdutf":"4.0.8","tz":"2023d","undici":"6.5.0","unicode":"15.1","uv":"1.47.0","uvwasi":"0.0.20","v8":"11.9.169.7-node.13","zlib":"1.3.0.1-motley-40e35a7"},"release":{"name":"node"},"osName":"Darwin","osRelease":"23.2.0","osVersion":"Darwin Kernel Version 23.2.0: Wed Nov 15 21:53:18 PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T6000","osMachine":"arm64","cpus":[{"model":"Apple M1 Pro","speed":2400,"user":7718020,"nice":0,"sys":6753110,"idle":5055410,"irq":0},{"model":"Apple M1 Pro","speed":2400,"user":7737480,"nice":0,"sys":6865050,"idle":5145220,"irq":0},{"model":"Apple M1 Pro","speed":2400,"user":3144460,"nice":0,"sys":4624780,"idle":14649410,"irq":0},{"model":"Apple M1 Pro","speed":2400,"user":2230050,"nice":0,"sys":2609660,"idle":17818810,"irq":0},{"model":"Apple M1 Pro","speed":2400,"user":1503730,"nice":0,"sys":1301700,"idle":20038910,"irq":0},{"model":"Apple M1 Pro","speed":2400,"user":1117320,"nice":0,"sys":811150,"idle":21006450,"irq":0},{"model":"Apple M1 Pro","speed":2400,"user":876230,"nice":0,"sys":595190,"idle":21549700,"irq":0},{"model":"Apple M1 Pro","speed":2400,"user":565350,"nice":0,"sys":351890,"idle":22131230,"irq":0},{"model":"Apple M1 Pro","speed":2400,"user":387920,"nice":0,"sys":202610,"idle":22474740,"irq":0},{"model":"Apple M1 Pro","speed":2400,"user":316510,"nice":0,"sys":149570,"idle":22605960,"irq":0}],"networkInterfaces":[{"name":"lo0","internal":true,"mac":"00:00:00:00:00:00","address":"127.0.0.1","netmask":"255.0.0.0","family":"IPv4"},{"name":"lo0","internal":true,"mac":"00:00:00:00:00:00","address":"::1","netmask":"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff","family":"IPv6","scopeid":0},{"name":"lo0","internal":true,"mac":"00:00:00:00:00:00","address":"fe80::1","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":1},{"name":"en5","internal":false,"mac":"06:4b:04:06:ed:e7","address":"fe80::44b:4ff:fe06:ede7","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":7},{"name":"en6","internal":false,"mac":"06:4b:04:06:ed:e8","address":"fe80::44b:4ff:fe06:ede8","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":8},{"name":"en7","internal":false,"mac":"06:4b:04:06:ed:e9","address":"fe80::44b:4ff:fe06:ede9","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":9},{"name":"bridge0","internal":false,"mac":"36:a9:c7:b1:1d:00","address":"192.168.2.1","netmask":"255.255.255.0","family":"IPv4"},{"name":"bridge0","internal":false,"mac":"36:a9:c7:b1:1d:00","address":"fe80::34a9:c7ff:feb1:1d00","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":13},{"name":"bridge0","internal":false,"mac":"36:a9:c7:b1:1d:00","address":"fd41:ee6a:f861:b172:48:4b41:cb9e:ad97","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":0},{"name":"ap1","internal":false,"mac":"f6:d4:88:75:58:5d","address":"fe80::f4d4:88ff:fe75:585d","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":14},{"name":"en0","internal":false,"mac":"f4:d4:88:75:58:5d","address":"2601:284:8204:1850::bd09","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":0},{"name":"en0","internal":false,"mac":"f4:d4:88:75:58:5d","address":"fe80::10c9:9d41:66d8:a63d","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":15},{"name":"en0","internal":false,"mac":"f4:d4:88:75:58:5d","address":"172.27.6.72","netmask":"255.255.248.0","family":"IPv4"},{"name":"awdl0","internal":false,"mac":"52:35:42:ae:26:90","address":"fe80::5035:42ff:feae:2690","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":16},{"name":"llw0","internal":false,"mac":"52:35:42:ae:26:90","address":"fe80::5035:42ff:feae:2690","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":17},{"name":"utun0","internal":false,"mac":"00:00:00:00:00:00","address":"fe80::6ef5:842a:ea56:c74a","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":19},{"name":"utun1","internal":false,"mac":"00:00:00:00:00:00","address":"fe80::96cf:7ae2:67fe:beef","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":20},{"name":"utun2","internal":false,"mac":"00:00:00:00:00:00","address":"fe80::f214:2548:e7e9:3c75","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":21},{"name":"utun3","internal":false,"mac":"00:00:00:00:00:00","address":"fe80::ce81:b1c:bd2c:69e","netmask":"ffff:ffff:ffff:ffff::","family":"IPv6","scopeid":22}],"host":"Ethans-MacBook-Pro.local"},"javascriptStack":{"message":"AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:","stack":["","false !== true","","at Object. (/Users/ethanarrowood/Documents/github/nodejs/node/test/report/test-report-config.js:70:8)","at Module._compile (node:internal/modules/cjs/loader:1370:14)","at Module._extensions..js (node:internal/modules/cjs/loader:1429:10)","at Module.load (node:internal/modules/cjs/loader:1208:32)","at Module._load (node:internal/modules/cjs/loader:1024:12)","at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:142:12)"],"errorProperties":{"generatedMessage":"true","code":"ERR_ASSERTION","actual":"false","expected":"true","operator":"strictEqual"}},"javascriptHeap":{"totalMemory":6242304,"executableMemory":262144,"totalCommittedMemory":5931008,"availableMemory":4340554448,"totalGlobalHandlesMemory":8192,"usedGlobalHandlesMemory":2976,"usedMemory":4573960,"memoryLimit":4345298944,"mallocedMemory":163968,"externalMemory":2169406,"peakMallocedMemory":279552,"nativeContextCount":1,"detachedContextCount":0,"doesZapGarbage":0,"heapSpaces":{"read_only_space":{"memorySize":0,"committedMemory":0,"capacity":0,"used":0,"available":0},"new_space":{"memorySize":2097152,"committedMemory":1851392,"capacity":1031008,"used":693408,"available":337600},"old_space":{"memorySize":3604480,"committedMemory":3670016,"capacity":3534600,"used":3533880,"available":720},"code_space":{"memorySize":262144,"committedMemory":131072,"capacity":212992,"used":84512,"available":128480},"shared_space":{"memorySize":0,"committedMemory":0,"capacity":0,"used":0,"available":0},"trusted_space":{"memorySize":0,"committedMemory":0,"capacity":0,"used":0,"available":0},"new_large_object_space":{"memorySize":0,"committedMemory":0,"capacity":1031008,"used":0,"available":1031008},"large_object_space":{"memorySize":278528,"committedMemory":278528,"capacity":262160,"used":262160,"available":0},"code_large_object_space":{"memorySize":0,"committedMemory":0,"capacity":0,"used":0,"available":0},"shared_large_object_space":{"memorySize":0,"committedMemory":0,"capacity":0,"used":0,"available":0},"trusted_large_object_space":{"memorySize":0,"committedMemory":0,"capacity":0,"used":0,"available":0}}},"nativeStack":[{"pc":"0x00000001029f1fe4","symbol":"node::TriggerNodeReport(v8::Isolate*, node::Environment*, char const*, char const*, std::__1::basic_string, std::__1::allocator> const&, v8::Local) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x000000010296d064","symbol":"node::ReportFatalException(node::Environment*, v8::Local, v8::Local, node::EnhanceFatalException) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x000000010296d92c","symbol":"node::errors::TriggerUncaughtException(v8::Isolate*, v8::Local, v8::Local, bool) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x0000000102cebd28","symbol":"v8::internal::MessageHandler::ReportMessageNoExceptions(v8::internal::Isolate*, v8::internal::MessageLocation const*, v8::internal::Handle, v8::Local) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x0000000102cebbe8","symbol":"v8::internal::MessageHandler::ReportMessage(v8::internal::Isolate*, v8::internal::MessageLocation const*, v8::internal::Handle) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x0000000102cdc1ac","symbol":"v8::internal::Isolate::ReportPendingMessages() [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x0000000102cc566c","symbol":"v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x0000000102cc4fb8","symbol":"v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handle, v8::internal::Handle, int, v8::internal::Handle*) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x0000000102b63758","symbol":"v8::Function::Call(v8::Local, v8::Local, int, v8::Local*) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x00000001029401f4","symbol":"node::builtins::BuiltinLoader::CompileAndCall(v8::Local, char const*, node::Realm*) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x00000001029ef4e0","symbol":"node::Realm::ExecuteBootstrapper(char const*) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x0000000102922314","symbol":"node::StartExecution(node::Environment*, char const*) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x00000001029222c8","symbol":"node::StartExecution(node::Environment*, std::__1::function (node::StartExecutionCallbackInfo const&)>) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x0000000102883a0c","symbol":"node::LoadEnvironment(node::Environment*, std::__1::function (node::StartExecutionCallbackInfo const&)>) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x00000001029afec8","symbol":"node::NodeMainInstance::Run(node::ExitCode*, node::Environment*) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x00000001029afcb8","symbol":"node::NodeMainInstance::Run() [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x0000000102925294","symbol":"node::Start(int, char**) [/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node]"},{"pc":"0x0000000183b0d0e0","symbol":"start [/usr/lib/dyld]"}],"resourceUsage":{"free_memory":499728384,"total_memory":17179869184,"rss":45727744,"available_memory":499728384,"userCpuSeconds":0.051901,"kernelCpuSeconds":0.005606,"cpuConsumptionPercent":5.7507,"userCpuConsumptionPercent":5.1901,"kernelCpuConsumptionPercent":0.5606,"maxRss":45727744,"pageFaults":{"IORequired":0,"IONotRequired":3097},"fsActivity":{"reads":0,"writes":0}},"libuv":[{"type":"async","is_active":true,"is_referenced":false,"address":"0x000060000239cd80"},{"type":"async","is_active":true,"is_referenced":false,"address":"0x0000000106dba638"},{"type":"timer","is_active":false,"is_referenced":false,"address":"0x00000001448392b0","repeat":0,"firesInMsFromNow":-246798228,"expired":true},{"type":"check","is_active":true,"is_referenced":false,"address":"0x0000000144839348"},{"type":"idle","is_active":false,"is_referenced":true,"address":"0x00000001448393c0"},{"type":"prepare","is_active":true,"is_referenced":false,"address":"0x0000000144839438"},{"type":"check","is_active":true,"is_referenced":false,"address":"0x00000001448394b0"},{"type":"async","is_active":true,"is_referenced":false,"address":"0x0000000144839528"},{"type":"signal","is_active":false,"is_referenced":false,"address":"0x000060000319cc58","signum":0,"signal":""},{"type":"signal","is_active":true,"is_referenced":false,"address":"0x0000600003190058","signum":31,"signal":"SIGUSR2"},{"type":"loop","is_active":true,"address":"0x0000000106dc39f8","loopIdleTimeSeconds":0}],"workers":[],"environmentVariables":{"__CFBundleIdentifier":"com.apple.Terminal","TMPDIR":"/var/folders/18/kzz_6sqd06v65yv4b1w4nkj80000gn/T/","XPC_FLAGS":"0x0","LaunchInstanceID":"184BB521-0C48-4BC8-96E4-22C71458496D","TERM":"xterm-256color","SSH_AUTH_SOCK":"/private/tmp/com.apple.launchd.uL6W9igfDp/Listeners","SECURITYSESSIONID":"186b2","XPC_SERVICE_NAME":"0","TERM_PROGRAM":"Apple_Terminal","TERM_PROGRAM_VERSION":"452","TERM_SESSION_ID":"F91C5239-CABE-4A79-A66F-2E89E91540BC","SHELL":"/bin/zsh","HOME":"/Users/ethanarrowood","LOGNAME":"ethanarrowood","USER":"ethanarrowood","PATH":"/Users/ethanarrowood/.opam/default/bin:/Users/ethanarrowood/Library/Python/3.8/bin:/Users/ethanarrowood/Library/Caches/fnm_multishells/6687_1707146400520/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/usr/local/MacGPG2/bin:/usr/local/go/bin:/opt/podman/bin:/Users/ethanarrowood/.cargo/bin:/usr/local/go/bin","SHLVL":"1","PWD":"/Users/ethanarrowood/Documents/github/nodejs/node","OLDPWD":"/Users/ethanarrowood","HOMEBREW_PREFIX":"/opt/homebrew","HOMEBREW_CELLAR":"/opt/homebrew/Cellar","HOMEBREW_REPOSITORY":"/opt/homebrew","MANPATH":"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/share/man:/Library/Developer/CommandLineTools/usr/share/man:/Library/Developer/CommandLineTools/Toolchains/XcodeDefault.xctoolchain/usr/share/man:/opt/homebrew/share/man::","INFOPATH":"/opt/homebrew/share/info:","STARSHIP_SHELL":"zsh","STARSHIP_SESSION_KEY":"7730876063113258","FNM_MULTISHELL_PATH":"/Users/ethanarrowood/Library/Caches/fnm_multishells/6687_1707146400520","FNM_ARCH":"arm64","FNM_DIR":"/Users/ethanarrowood/Library/Application Support/fnm","FNM_VERSION_FILE_STRATEGY":"local","FNM_LOGLEVEL":"info","FNM_NODE_DIST_MIRROR":"https://nodejs.org/dist","GOPATH":"/Users/ethanarrowood/.go","GOROOT":"/usr/local/go","AWS_PROFILE":"production","NPM_TOKEN":"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","PYTHON3_BIN":"/Users/ethanarrowood/Library/Python/3.8/bin","CC":"ccache cc","CXX":"ccache c++","OPENAI_SECRET_KEY_OPENAI_NODE":"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","PERSONAL_VERCEL_TOKEN":"xhZuWfbHIZxfLxmN2IHMLwai","VERCEL_TEST_TOKEN":"Ay33PNbA3KnP00OvRbrLYEii","VERCEL_TEST_REGISTRATION_URL":"https://vercel.com/api/now/registration/test-account?teamId=team_WMX7HBP10AO5sTaf2MqsH538","VERCEL_TOKEN_FRAMEWORK_TEST_MATRIX":"IBOZ7BDk0yHZlQVZKAl6wTma","AZURE_TOKEN":"kytpz75rpwnfegnfeg7vhecpt7hb5mmaef67ktuffebvodobme6a","AWS_ACCESS_KEY_ID":"ASIA6HKOF7F6N5HINN5A","AWS_SECRET_ACCESS_KEY":"7Z2hAOuE2MehWwHmHWSQG7qmQS4QIGg2M5pedbe5","AWS_SESSION_TOKEN":"IQoJb3JpZ2luX2VjEOP//////////wEaCXVzLWVhc3QtMSJHMEUCIBrWLRQXSuEuZ7DOFn0wPTFaR+P5v4hbH5wI2ahEozxFAiEA5Km7NYissbKFe6r+xY4CTdJyENiYreK+DeCJeXr86Y0qnAMIHBAEGgw5Nzc4MDU5MDAxNTYiDN1mi0ds4YV0d0QzDSr5ApsOa8TXYGofpe6lykgXVMU8XIe7mxehHHJtvdvJVHpnwl5uYNaM4L9doQr1xeMlG2/x/UF/dDdI/PDEeeR7cvqoMO32WQJLcxNokt66Q7qV0GqbbyGwh+BINboSHWxNnJmTSUyLXEA1e13EgGt5NGSxeJZ9gaXNbNYjOZhG0k9WeHLRTbfD91DHckRUoUqYeSTHzeCobNkSiT1vxCeD9M3CNjIRcGNUeR3dUE8coeZt1ZDzeSoJI0II6Dgh0chbQegifgjHM/TdG6y2Z3uibvL9vDigkddWeMRIBDRguKZuuY7AbaX1ohtQ2Ygj8c6D5u7FhzAogJn6s7zlaOaxxK5OJ5ufDZN/IEFckv4hCUKCfLFnt24eD1nCq+AUHEnxuf8dXV0lRwPRMjPIHWang3tV5ssKkgWtRXTP/X9JAzfjVwu2WUsx5Pfo/8gOL9QhVYvorY5jd9u5MYB26BeVzSfuRiYAkmsXeiWzJTc9ORKIX3Gzge73rZNMMI+/iqoGOqYBm/4+W9hy3d1tUzLW7+/mvtZsKOENIfDQLfS54vIzydQUqdQ9eiOvMeUcPi0wFqAK7WP5YxxmfUUGIWD+bJjqzcVtVTC2jJ18U3fUHV7wEEmW/+WxigcEyUrsB0a3pLZQS387U6fkhUYj23vvzdR8SeuJ7RYZkPwbMVYzX/wuv/qtmTk32r0RR7HjkTH/aS4u8iVbLINVB2ceK9E7v5wv2D1wfCh3cg==","OPAM_SWITCH_PREFIX":"/Users/ethanarrowood/.opam/default","CAML_LD_LIBRARY_PATH":"/Users/ethanarrowood/.opam/default/lib/stublibs:/Users/ethanarrowood/.opam/default/lib/ocaml/stublibs:/Users/ethanarrowood/.opam/default/lib/ocaml","OCAML_TOPLEVEL_PATH":"/Users/ethanarrowood/.opam/default/lib/toplevel","LANG":"en_US.UTF-8","_":"/Users/ethanarrowood/Documents/github/nodejs/node/tools/test.py","__CF_USER_TEXT_ENCODING":"0x1F5:0x0:0x0","SDKROOT":"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk","CPATH":"/usr/local/include","LIBRARY_PATH":"/usr/local/lib","TEST_SERIAL_ID":"0","TEST_THREAD_ID":"1","TEST_PARALLEL":"1","GITHUB_STEP_SUMMARY":""},"userLimits":{"core_file_size_blocks":{"soft":0,"hard":"unlimited"},"data_seg_size_kbytes":{"soft":"unlimited","hard":"unlimited"},"file_size_blocks":{"soft":"unlimited","hard":"unlimited"},"max_locked_memory_bytes":{"soft":"unlimited","hard":"unlimited"},"max_memory_size_kbytes":{"soft":"unlimited","hard":"unlimited"},"open_files":{"soft":1048575,"hard":"unlimited"},"stack_size_bytes":{"soft":8372224,"hard":67092480},"cpu_time_seconds":{"soft":"unlimited","hard":"unlimited"},"max_user_processes":{"soft":2666,"hard":4000},"virtual_memory_kbytes":{"soft":"unlimited","hard":"unlimited"}},"sharedObjects":["/Users/ethanarrowood/Documents/github/nodejs/node/out/Release/node","/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation","/usr/lib/libobjc.A.dylib","/System/Library/PrivateFrameworks/CoreServicesInternal.framework/Versions/A/CoreServicesInternal","/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation","/usr/lib/liboah.dylib","/usr/lib/libfakelink.dylib","/usr/lib/libicucore.A.dylib","/usr/lib/libSystem.B.dylib","/System/Library/PrivateFrameworks/SoftLinking.framework/Versions/A/SoftLinking","/usr/lib/libc++abi.dylib","/usr/lib/libc++.1.dylib","/usr/lib/system/libcache.dylib","/usr/lib/system/libcommonCrypto.dylib","/usr/lib/system/libcompiler_rt.dylib","/usr/lib/system/libcopyfile.dylib","/usr/lib/system/libcorecrypto.dylib","/usr/lib/system/libdispatch.dylib","/usr/lib/system/libdyld.dylib","/usr/lib/system/libkeymgr.dylib","/usr/lib/system/libmacho.dylib","/usr/lib/system/libquarantine.dylib","/usr/lib/system/libremovefile.dylib","/usr/lib/system/libsystem_asl.dylib","/usr/lib/system/libsystem_blocks.dylib","/usr/lib/system/libsystem_c.dylib","/usr/lib/system/libsystem_collections.dylib","/usr/lib/system/libsystem_configuration.dylib","/usr/lib/system/libsystem_containermanager.dylib","/usr/lib/system/libsystem_coreservices.dylib","/usr/lib/system/libsystem_darwin.dylib","/usr/lib/system/libsystem_darwindirectory.dylib","/usr/lib/system/libsystem_dnssd.dylib","/usr/lib/system/libsystem_featureflags.dylib","/usr/lib/system/libsystem_info.dylib","/usr/lib/system/libsystem_m.dylib","/usr/lib/system/libsystem_malloc.dylib","/usr/lib/system/libsystem_networkextension.dylib","/usr/lib/system/libsystem_notify.dylib","/usr/lib/system/libsystem_sandbox.dylib","/usr/lib/system/libsystem_secinit.dylib","/usr/lib/system/libsystem_kernel.dylib","/usr/lib/system/libsystem_platform.dylib","/usr/lib/system/libsystem_pthread.dylib","/usr/lib/system/libsystem_symptoms.dylib","/usr/lib/system/libsystem_trace.dylib","/usr/lib/system/libunwind.dylib","/usr/lib/system/libxpc.dylib","/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit","/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices","/usr/lib/libDiagnosticMessagesClient.dylib","/usr/lib/libenergytrace.dylib","/usr/lib/libbsm.0.dylib","/usr/lib/libz.1.dylib","/usr/lib/system/libkxld.dylib","/System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork","/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents","/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore","/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata","/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices","/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit","/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE","/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices","/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices","/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SharedFileList.framework/Versions/A/SharedFileList","/System/Library/Frameworks/Security.framework/Versions/A/Security","/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration","/usr/lib/libapple_nghttp2.dylib","/usr/lib/libcompression.dylib","/usr/lib/libsqlite3.dylib","/System/Library/Frameworks/Network.framework/Versions/A/Network","/usr/lib/libCoreEntitlements.dylib","/System/Library/PrivateFrameworks/MessageSecurity.framework/Versions/A/MessageSecurity","/System/Library/PrivateFrameworks/ProtocolBuffer.framework/Versions/A/ProtocolBuffer","/usr/lib/libMobileGestalt.dylib","/System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression","/usr/lib/libcoretls.dylib","/usr/lib/libcoretls_cfhelpers.dylib","/usr/lib/libpam.2.dylib","/usr/lib/libxar.1.dylib","/System/Library/PrivateFrameworks/CoreAutoLayout.framework/Versions/A/CoreAutoLayout","/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration","/usr/lib/libarchive.2.dylib","/usr/lib/libxml2.2.dylib","/usr/lib/liblangid.dylib","/System/Library/Frameworks/Combine.framework/Versions/A/Combine","/System/Library/PrivateFrameworks/CollectionsInternal.framework/Versions/A/CollectionsInternal","/System/Library/PrivateFrameworks/ReflectionInternal.framework/Versions/A/ReflectionInternal","/System/Library/PrivateFrameworks/RuntimeInternal.framework/Versions/A/RuntimeInternal","/usr/lib/swift/libswiftCore.dylib","/usr/lib/swift/libswiftCoreFoundation.dylib","/usr/lib/swift/libswiftDarwin.dylib","/usr/lib/swift/libswiftDispatch.dylib","/usr/lib/swift/libswiftIOKit.dylib","/usr/lib/swift/libswiftObjectiveC.dylib","/usr/lib/swift/libswiftXPC.dylib","/usr/lib/swift/libswift_Concurrency.dylib","/usr/lib/swift/libswift_StringProcessing.dylib","/usr/lib/swift/libswiftos.dylib","/System/Library/PrivateFrameworks/AppleSystemInfo.framework/Versions/A/AppleSystemInfo","/usr/lib/libpcap.A.dylib","/usr/lib/libdns_services.dylib","/usr/lib/libnetwork.dylib","/System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/Versions/A/IOMobileFramebuffer","/System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface","/usr/lib/liblzma.5.dylib","/usr/lib/swift/libswift_RegexParser.dylib","/usr/lib/libbz2.1.0.dylib","/usr/lib/libiconv.2.dylib","/usr/lib/libcharset.1.dylib","/usr/lib/libheimdal-asn1.dylib","/usr/lib/libCheckFix.dylib","/System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC","/System/Library/PrivateFrameworks/CoreNLP.framework/Versions/A/CoreNLP","/System/Library/PrivateFrameworks/MetadataUtilities.framework/Versions/A/MetadataUtilities","/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate","/usr/lib/libmecab.dylib","/usr/lib/libCRFSuite.dylib","/usr/lib/libgermantok.dylib","/usr/lib/libThaiTokenizer.dylib","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libQuadrature.dylib","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBNNS.dylib","/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparse.dylib","/System/Library/PrivateFrameworks/MIL.framework/Versions/A/MIL","/System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory","/System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory","/System/Library/PrivateFrameworks/APFS.framework/Versions/A/APFS","/System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation","/usr/lib/libutil.dylib","/System/Library/PrivateFrameworks/InstalledContentLibrary.framework/Versions/A/InstalledContentLibrary","/System/Library/PrivateFrameworks/CoreServicesStore.framework/Versions/A/CoreServicesStore","/usr/lib/libapp_launch_measurement.dylib","/System/Library/PrivateFrameworks/AppleMobileFileIntegrity.framework/Versions/A/AppleMobileFileIntegrity","/usr/lib/libmis.dylib","/System/Library/PrivateFrameworks/MobileSystemServices.framework/Versions/A/MobileSystemServices","/System/Library/PrivateFrameworks/ConfigProfileHelper.framework/Versions/A/ConfigProfileHelper","/System/Library/PrivateFrameworks/CoreAnalytics.framework/Versions/A/CoreAnalytics","/System/Library/PrivateFrameworks/AppleSauce.framework/Versions/A/AppleSauce","/System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling","/usr/lib/libxslt.1.dylib","/usr/lib/libcmph.dylib","/System/Library/PrivateFrameworks/CoreEmoji.framework/Versions/A/CoreEmoji","/System/Library/PrivateFrameworks/LinguisticData.framework/Versions/A/LinguisticData","/System/Library/PrivateFrameworks/Lexicon.framework/Versions/A/Lexicon","/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement","/usr/lib/libTLE.dylib"]}