From fb01dfb672ec8d8d18706a24ab2b9cedeb6a4029 Mon Sep 17 00:00:00 2001 From: David Mason Date: Fri, 17 Feb 2023 15:42:42 -0800 Subject: [PATCH] Env var to disable stack collection --- src/coreclr/inc/clrconfigvalues.h | 1 + src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h | 9 +++++++++ src/mono/mono/eventpipe/ep-rt-mono.h | 15 +++++++++++++++ src/native/eventpipe/ep-buffer-manager.c | 2 +- src/native/eventpipe/ep-rt.h | 4 ++++ src/native/eventpipe/ep-session.c | 1 + src/native/eventpipe/ep-session.h | 3 +++ 7 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/coreclr/inc/clrconfigvalues.h b/src/coreclr/inc/clrconfigvalues.h index 7fe6e3ff01eec..be75f12be9184 100644 --- a/src/coreclr/inc/clrconfigvalues.h +++ b/src/coreclr/inc/clrconfigvalues.h @@ -688,6 +688,7 @@ RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeRundown, W("EventPipeRundown"), 1, "E RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeCircularMB, W("EventPipeCircularMB"), 1024, "The EventPipe circular buffer size in megabytes.") RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeProcNumbers, W("EventPipeProcNumbers"), 0, "Enable/disable capturing processor numbers in EventPipe event headers") RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeOutputStreaming, W("EventPipeOutputStreaming"), 0, "Enable/disable streaming for trace file set in DOTNET_EventPipeOutputPath. Non-zero values enable streaming.") +RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeDisableStacks, W("EventPipeDisableStacks"), 0, "Set to 1 to disable collecting stacks for EventPipe events.") #ifdef FEATURE_AUTO_TRACE RETAIL_CONFIG_DWORD_INFO_EX(INTERNAL_AutoTrace_N_Tracers, W("AutoTrace_N_Tracers"), 0, "", CLRConfig::LookupOptions::ParseIntegerAsBase10) diff --git a/src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h b/src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h index 0bfff62a879c5..c26617f3543fa 100644 --- a/src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h +++ b/src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h @@ -1691,6 +1691,15 @@ ep_rt_config_value_get_output_streaming (void) return CLRConfig::GetConfigValue (CLRConfig::INTERNAL_EventPipeOutputStreaming) != 0; } +static +inline +bool +ep_rt_config_value_get_disable_stacks (void) +{ + STATIC_CONTRACT_NOTHROW; + return CLRConfig::GetConfigValue(CLRConfig::INTERNAL_EventPipeDisableStacks) != 0; +} + /* * EventPipeSampleProfiler. */ diff --git a/src/mono/mono/eventpipe/ep-rt-mono.h b/src/mono/mono/eventpipe/ep-rt-mono.h index 2e3bdabac805a..cf27ccdf42ba6 100644 --- a/src/mono/mono/eventpipe/ep-rt-mono.h +++ b/src/mono/mono/eventpipe/ep-rt-mono.h @@ -1017,6 +1017,21 @@ ep_rt_config_value_get_rundown (void) return value_uint32_t; } +static +inline +bool +ep_rt_config_value_get_disable_stacks (void) +{ + uint32_t value_uint32_t = 0; + gchar *value = g_getenv ("DOTNET_EventPipeDisableStacks"); + if (!value) + value = g_getenv ("COMPlus_EventPipeDisableStacks"); + if (value) + value_uint32_t = (uint32_t)atoi (value); + g_free (value); + return value_uint32_t; +} + /* * EventPipeSampleProfiler. */ diff --git a/src/native/eventpipe/ep-buffer-manager.c b/src/native/eventpipe/ep-buffer-manager.c index bda775b00250d..f928a700aea9f 100644 --- a/src/native/eventpipe/ep-buffer-manager.c +++ b/src/native/eventpipe/ep-buffer-manager.c @@ -970,7 +970,7 @@ ep_buffer_manager_write_event ( event_thread = thread; current_stack_contents = ep_stack_contents_init (&stack_contents); - if (stack == NULL && ep_event_get_need_stack (ep_event) && !ep_session_get_rundown_enabled (session)) { + if (stack == NULL && !ep_session_get_disable_stacks(session) && ep_event_get_need_stack (ep_event) && !ep_session_get_rundown_enabled (session)) { ep_walk_managed_stack_for_current_thread (current_stack_contents); stack = current_stack_contents; } diff --git a/src/native/eventpipe/ep-rt.h b/src/native/eventpipe/ep-rt.h index e7d7a12c7d0a7..c7ad03371cc0a 100644 --- a/src/native/eventpipe/ep-rt.h +++ b/src/native/eventpipe/ep-rt.h @@ -402,6 +402,10 @@ inline bool ep_rt_config_value_get_output_streaming (void); +static +bool +ep_rt_config_value_get_disable_stacks (void); + /* * EventPipeSampleProfiler. */ diff --git a/src/native/eventpipe/ep-session.c b/src/native/eventpipe/ep-session.c index 1106fd2619662..faf8d23984794 100644 --- a/src/native/eventpipe/ep-session.c +++ b/src/native/eventpipe/ep-session.c @@ -202,6 +202,7 @@ ep_session_alloc ( instance->session_start_time = ep_system_timestamp_get (); instance->session_start_timestamp = ep_perf_timestamp_get (); instance->paused = false; + instance->disable_stacks = ep_rt_config_value_get_disable_stacks(); ep_on_exit: ep_requires_lock_held (); diff --git a/src/native/eventpipe/ep-session.h b/src/native/eventpipe/ep-session.h index a38adc4e73cc0..22f48e3cd6869 100644 --- a/src/native/eventpipe/ep-session.h +++ b/src/native/eventpipe/ep-session.h @@ -59,6 +59,8 @@ struct _EventPipeSession_Internal { // we expect to remove it in the future once that limitation is resolved other scenarios are discouraged from using this given that // we plan to make it go away bool paused; + // Set via environment variable to prevent stack collection for all events + bool disable_stacks; }; #if !defined(EP_INLINE_GETTER_SETTER) && !defined(EP_IMPL_SESSION_GETTER_SETTER) @@ -75,6 +77,7 @@ EP_DEFINE_GETTER(EventPipeSession *, session, bool, rundown_requested) EP_DEFINE_GETTER(EventPipeSession *, session, ep_timestamp_t, session_start_time) EP_DEFINE_GETTER(EventPipeSession *, session, ep_timestamp_t, session_start_timestamp) EP_DEFINE_GETTER(EventPipeSession *, session, EventPipeFile *, file) +EP_DEFINE_GETTER(EventPipeSession *, session, bool, disable_stacks) EventPipeSession * ep_session_alloc (