Skip to content

Commit 8d5d797

Browse files
committed
fixup! cli: implement --trace-env and --trace-env-[js|native]-stack
1 parent 1dc934d commit 8d5d797

File tree

7 files changed

+36
-8
lines changed

7 files changed

+36
-8
lines changed

doc/api/cli.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2628,6 +2628,7 @@ The following accesses will be printed:
26282628
* Queries in the form of `Object.hasOwn(process.env, 'KEY')`,
26292629
`process.env.hasOwnProperty('KEY')` or `'KEY' in process.env`.
26302630
* Deletions in the form of `delete process.env.KEY`.
2631+
* Enumerations inf the form of `...process.env` or `Object.keys(process.env)`.
26312632

26322633
To print the stack trace of the access, use `--trace-env-js-stack` and/or
26332634
`--trace-env-native-stack`.

src/node_credentials.cc

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,7 @@ bool SafeGetenv(const char* key, std::string* text, Environment* env) {
111111
fprintf(stderr, "undefined\n");
112112
}
113113

114-
if (options->trace_env_native_stack) {
115-
DumpNativeBacktrace(stderr);
116-
}
117-
if (options->trace_env_js_stack) {
118-
DumpJavaScriptBacktrace(stderr);
119-
}
114+
PrintTraceEnvStack(options);
120115
}
121116

122117
return has_env;

src/node_env_var.cc

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,10 +338,14 @@ Maybe<void> KVStore::AssignToObject(v8::Isolate* isolate,
338338
}
339339

340340
void PrintTraceEnvStack(Environment* env) {
341-
if (env->options()->trace_env_native_stack) {
341+
PrintTraceEnvStack(env->options());
342+
}
343+
344+
void PrintTraceEnvStack(std::shared_ptr<EnvironmentOptions> options) {
345+
if (options->trace_env_native_stack) {
342346
DumpNativeBacktrace(stderr);
343347
}
344-
if (env->options()->trace_env_js_stack) {
348+
if (options->trace_env_js_stack) {
345349
DumpJavaScriptBacktrace(stderr);
346350
}
347351
}
@@ -483,6 +487,12 @@ static void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
483487
Environment* env = Environment::GetCurrent(info);
484488
CHECK(env->has_run_bootstrapping_code());
485489

490+
if (env->options()->trace_env) {
491+
fprintf(stderr, "[--trace-env] enumerate environment variables\n");
492+
493+
PrintTraceEnvStack(env);
494+
}
495+
486496
info.GetReturnValue().Set(
487497
env->env_vars()->Enumerate(env->isolate()));
488498
}

src/node_internals.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,9 @@ namespace credentials {
324324
bool SafeGetenv(const char* key, std::string* text, Environment* env = nullptr);
325325
} // namespace credentials
326326

327+
void PrintTraceEnvStack(Environment* env);
328+
void PrintTraceEnvStack(std::shared_ptr<EnvironmentOptions> options);
329+
327330
void DefineZlibConstants(v8::Local<v8::Object> target);
328331
v8::Isolate* NewIsolate(v8::Isolate::CreateParams* params,
329332
uv_loop_t* event_loop,
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Object.keys(process.env);
2+
3+
const env = { ...process.env };

test/parallel/test-trace-env-stack.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,11 @@ spawnSyncAndAssert(process.execPath, ['--trace-env-js-stack', fixtures.path('pro
7575
assert.match(output, /delete\.js:1:16/);
7676
}
7777
});
78+
79+
// Check enumeration from user land.
80+
spawnSyncAndAssert(process.execPath, ['--trace-env-js-stack', fixtures.path('process-env', 'enumerate.js') ], {
81+
stderr(output) {
82+
assert.match(output, /enumerate\.js:1:8/);
83+
assert.match(output, /enumerate\.js:3:26/);
84+
}
85+
});

test/parallel/test-trace-env.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,11 @@ spawnSyncAndAssert(process.execPath, ['--trace-env', fixtures.path('process-env'
7979
assert.match(output, /delete environment variable "FOO"/);
8080
}
8181
});
82+
83+
// Check enumeration from user land.
84+
spawnSyncAndAssert(process.execPath, ['--trace-env', fixtures.path('process-env', 'enumerate.js') ], {
85+
stderr(output) {
86+
const matches = output.match(/enumerate environment variables/g);
87+
assert.strictEqual(matches.length, 2);
88+
}
89+
});

0 commit comments

Comments
 (0)