@@ -41,13 +41,15 @@ internal class DebuggerManager
4141 private readonly TaskCompletionSource < bool > _processExit ;
4242 private volatile bool _isDebuggerEndpointAvailable ;
4343 private int _initialized ;
44+ private int _symDbInitialized ;
4445 private volatile TaskCompletionSource < bool > ? _diDebounceGate ;
4546 private volatile DynamicInstrumentation ? _dynamicInstrumentation ;
4647 private int _diState ; // 0 = disabled, 1 = initializing, 2 = initialized
4748
4849 private DebuggerManager ( DebuggerSettings debuggerSettings , ExceptionReplaySettings exceptionReplaySettings )
4950 {
5051 _initialized = 0 ;
52+ _symDbInitialized = 0 ;
5153 _isDebuggerEndpointAvailable = false ;
5254 DebuggerSettings = debuggerSettings ;
5355 ExceptionReplaySettings = exceptionReplaySettings ;
@@ -157,6 +159,8 @@ private Task UpdateProductsState(TracerSettings tracerSettings, DebuggerSettings
157159
158160 OneTimeSetup ( tracerSettings ) ;
159161
162+ InitializeSymbolUploaderIfNeeded ( tracerSettings , newDebuggerSettings ) ;
163+
160164 lock ( _syncLock )
161165 {
162166 if ( _processExit . Task . IsCompleted )
@@ -181,19 +185,31 @@ private void OneTimeSetup(TracerSettings tracerSettings)
181185
182186 LifetimeManager . Instance . AddShutdownTask ( ShutdownTasks ) ;
183187 SetGeneralConfig ( tracerSettings , DebuggerSettings ) ;
184- InitializeSymbolUploader ( tracerSettings ) ;
185188 if ( tracerSettings . StartupDiagnosticLogEnabled )
186189 {
187190 _ = Task . Run ( WriteStartupDebuggerDiagnosticLog ) ;
188191 }
189192 }
190193
191- private void InitializeSymbolUploader ( TracerSettings tracerSettings )
194+ private void InitializeSymbolUploaderIfNeeded ( TracerSettings tracerSettings , DebuggerSettings newDebuggerSettings )
192195 {
193196 try
194197 {
195- if ( _processExit . Task . IsCompleted || ! DebuggerSettings . SymbolDatabaseUploadEnabled )
198+ if ( _processExit . Task . IsCompleted )
199+ {
200+ return ;
201+ }
202+
203+ if ( Interlocked . CompareExchange ( ref _symDbInitialized , 1 , 0 ) != 0 )
204+ {
205+ // Once created, the symbol uploader persists even if DI is later disabled
206+ return ;
207+ }
208+
209+ if ( ! DebuggerSettings . SymbolDatabaseUploadEnabled
210+ || ! newDebuggerSettings . DynamicInstrumentationCanBeEnabled )
196211 {
212+ // explicitly disabled via local env var or DI can not be enabled
197213 return ;
198214 }
199215
@@ -203,14 +219,21 @@ private void InitializeSymbolUploader(TracerSettings tracerSettings)
203219 return ;
204220 }
205221
222+ if ( ! newDebuggerSettings . DynamicInstrumentationEnabled
223+ && newDebuggerSettings . DynamicSettings . DynamicInstrumentationEnabled != true )
224+ {
225+ return ;
226+ }
227+
228+ // initialize symbol database uploader only if DI is enabled locally or remotely
206229 var tracerManager = TracerManager . Instance ;
207- SymbolsUploader = DebuggerFactory . CreateSymbolsUploader ( tracerManager . DiscoveryService , RcmSubscriptionManager . Instance , ServiceName , tracerSettings , DebuggerSettings , tracerManager . GitMetadataTagsProvider ) ;
208- _ = SymbolsUploader . StartFlushingAsync ( )
209- . ContinueWith (
210- t => Log . Error ( t ? . Exception , "Failed to initialize symbol uploader" ) ,
211- CancellationToken . None ,
212- TaskContinuationOptions . OnlyOnFaulted ,
213- TaskScheduler . Default ) ;
230+ this . SymbolsUploader = DebuggerFactory . CreateSymbolsUploader ( tracerManager . DiscoveryService , RcmSubscriptionManager . Instance , this . ServiceName , tracerSettings , this . DebuggerSettings , tracerManager . GitMetadataTagsProvider ) ;
231+ _ = this . SymbolsUploader . StartFlushingAsync ( )
232+ . ContinueWith (
233+ t => Log . Error ( t ? . Exception , "Failed to initialize symbol uploader" ) ,
234+ CancellationToken . None ,
235+ TaskContinuationOptions . OnlyOnFaulted ,
236+ TaskScheduler . Default ) ;
214237 }
215238 catch ( Exception ex )
216239 {
@@ -377,7 +400,7 @@ private bool ShouldSkipDiUpdate(bool requested, bool current, DebuggerSettings d
377400 {
378401 if ( requested && ! debuggerSettings . DynamicInstrumentationCanBeEnabled )
379402 {
380- Log . Debug ( "Code Origin can't be enabled because the local environment variable is set to false" ) ;
403+ Log . Debug ( "Dynamic Instrumentation can't be enabled because the local environment variable is set to false" ) ;
381404 return true ;
382405 }
383406
0 commit comments