From 391c9a98b1a4cbdce34e2eefe0979cf645c66f30 Mon Sep 17 00:00:00 2001 From: dudik Date: Thu, 19 Dec 2024 14:50:57 +0100 Subject: [PATCH] 1. Disable symdb compression 2. Do not use LD in ER 3. Fix OutOfRange in SymDB --- .../Debugger/DebuggerSettings.cs | 2 +- .../FrameFilter.cs | 3 +- .../Debugger/Symbols/SymbolExtractor.cs | 44 ++++++++++--------- .../Debugger/Upload/SymbolUploadApi.cs | 4 +- .../PDBs/DatadogMetadataReader.Dnlib.cs | 2 +- 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/tracer/src/Datadog.Trace/Debugger/DebuggerSettings.cs b/tracer/src/Datadog.Trace/Debugger/DebuggerSettings.cs index 0acf22d042fa..4bcd879b5d4f 100644 --- a/tracer/src/Datadog.Trace/Debugger/DebuggerSettings.cs +++ b/tracer/src/Datadog.Trace/Debugger/DebuggerSettings.cs @@ -124,7 +124,7 @@ public DebuggerSettings(IConfigurationSource? source, IConfigurationTelemetry te .AsInt32(DefaultCodeOriginExitSpanFrames, frames => frames > 0) .Value; - SymbolDatabaseCompressionEnabled = config.WithKeys(ConfigurationKeys.Debugger.SymbolDatabaseCompressionEnabled).AsBool(true); + SymbolDatabaseCompressionEnabled = config.WithKeys(ConfigurationKeys.Debugger.SymbolDatabaseCompressionEnabled).AsBool(false); } public bool Enabled { get; } diff --git a/tracer/src/Datadog.Trace/Debugger/ExceptionAutoInstrumentation/FrameFilter.cs b/tracer/src/Datadog.Trace/Debugger/ExceptionAutoInstrumentation/FrameFilter.cs index 2ed8e76820a4..c1e66d7fb68c 100644 --- a/tracer/src/Datadog.Trace/Debugger/ExceptionAutoInstrumentation/FrameFilter.cs +++ b/tracer/src/Datadog.Trace/Debugger/ExceptionAutoInstrumentation/FrameFilter.cs @@ -7,6 +7,7 @@ using System.Reflection; using System.Reflection.Emit; using Datadog.Trace.Debugger.Symbols; +using Datadog.Trace.VendoredMicrosoftCode.System.Collections.Immutable; #nullable enable namespace Datadog.Trace.Debugger.ExceptionAutoInstrumentation @@ -64,7 +65,7 @@ internal static bool IsBlockList(MethodBase method) return true; } - return AssemblyFilter.ShouldSkipAssembly(method.Module.Assembly, LiveDebugger.Instance.Settings.ThirdPartyDetectionExcludes, LiveDebugger.Instance.Settings.ThirdPartyDetectionIncludes); + return AssemblyFilter.ShouldSkipAssembly(method.Module.Assembly, ImmutableHashSet.Empty, ImmutableHashSet.Empty); } internal static bool ShouldSkipNamespaceIfOnTopOfStack(MethodBase method) diff --git a/tracer/src/Datadog.Trace/Debugger/Symbols/SymbolExtractor.cs b/tracer/src/Datadog.Trace/Debugger/Symbols/SymbolExtractor.cs index ef5484e05964..9c8a897efdcd 100644 --- a/tracer/src/Datadog.Trace/Debugger/Symbols/SymbolExtractor.cs +++ b/tracer/src/Datadog.Trace/Debugger/Symbols/SymbolExtractor.cs @@ -683,46 +683,50 @@ void PopulateClosureMethod(MethodDefinition generatedMethod, TypeDefinition owne return [new Symbol { Name = "this", SymbolType = SymbolType.Arg, Line = UnknownFieldAndArgLine, Type = method.GetDeclaringType().FullName(MetadataReader) }]; } - var argsSymbol = CreateArgSymbolArray(method, parameters); + var argsSymbol = method.IsStaticMethod() ? new Symbol[parameters.Count] : new Symbol[parameters.Count + 1]; // 'this' int index = 0; var methodSig = method.DecodeSignature(new TypeProvider(false), 0); - var paramTypesMatchArgSymbols = methodSig.ParameterTypes.Length == argsSymbol.Length || methodSig.ParameterTypes.Length == argsSymbol.Length - 1; + var typesIndex = 0; + if (!method.IsStaticMethod()) + { + var thisSymbol = new Symbol { Name = "this", SymbolType = SymbolType.Arg, Line = UnknownFieldAndArgLine, Type = method.GetDeclaringType().FullName(MetadataReader) }; + argsSymbol[0] = thisSymbol; + index++; + } + foreach (var parameterHandle in parameters) { + if (parameterHandle.IsNil) + { + continue; + } + var parameterDef = MetadataReader.GetParameter(parameterHandle); - if (index == 0 && !method.IsStaticMethod()) + var parameterName = MetadataReader.GetString(parameterDef.Name); + if (string.IsNullOrEmpty(parameterName)) { - argsSymbol[index] = new Symbol { Name = "this", SymbolType = SymbolType.Arg, Line = UnknownFieldAndArgLine, Type = method.GetDeclaringType().FullName(MetadataReader) }; - index++; + continue; + } - if (parameterDef.IsHiddenThis()) - { - continue; - } + if (parameterDef.IsHiddenThis()) + { + continue; } argsSymbol[index] = new Symbol { - Name = MetadataReader.GetString(parameterDef.Name), + Name = parameterName, SymbolType = SymbolType.Arg, Line = UnknownFieldAndArgLine, - Type = paramTypesMatchArgSymbols ? methodSig.ParameterTypes[parameterDef.IsHiddenThis() ? index : index - 1] : "Unknown" + Type = typesIndex < methodSig.ParameterTypes.Length ? methodSig.ParameterTypes[typesIndex] : "Unknown" }; index++; + typesIndex++; } return argsSymbol; } - private Symbol[] CreateArgSymbolArray(MethodDefinition method, ParameterHandleCollection parameters) - { - // ReSharper disable once NotDisposedResource - return method.IsStaticMethod() ? - new Symbol[parameters.Count] : - MetadataReader.GetParameter(parameters.GetEnumerator().Current).IsHiddenThis() ? - new Symbol[parameters.Count] : new Symbol[parameters.Count + 1]; - } - private string[]? GetClassBaseClassNames(TypeDefinition type) { EntityHandle? baseType = type.BaseType; diff --git a/tracer/src/Datadog.Trace/Debugger/Upload/SymbolUploadApi.cs b/tracer/src/Datadog.Trace/Debugger/Upload/SymbolUploadApi.cs index 766360d5e382..8cc036669434 100644 --- a/tracer/src/Datadog.Trace/Debugger/Upload/SymbolUploadApi.cs +++ b/tracer/src/Datadog.Trace/Debugger/Upload/SymbolUploadApi.cs @@ -38,7 +38,7 @@ private SymbolUploadApi( { _apiRequestFactory = apiRequestFactory; _eventMetadata = eventMetadata; - _enableCompression = enableCompression; + _enableCompression = false; //enableCompression; discoveryService.SubscribeToChanges(c => Endpoint = c.SymbolDbEndpoint); } @@ -94,7 +94,7 @@ public override async Task SendBatchAsync(ArraySegment symbols) using var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress); await gzipStream.WriteAsync(symbols.Array, 0, symbols.Array.Length).ConfigureAwait(false); #endif - symbolsItem = new MultipartFormItem("file", "gzip", "file.gz", new ArraySegment(memoryStream.ToArray())); + symbolsItem = new MultipartFormItem("file", "application/gzip", "file.gz", new ArraySegment(memoryStream.ToArray())); } else { diff --git a/tracer/src/Datadog.Trace/PDBs/DatadogMetadataReader.Dnlib.cs b/tracer/src/Datadog.Trace/PDBs/DatadogMetadataReader.Dnlib.cs index 175d6bddfa35..5419af35a628 100644 --- a/tracer/src/Datadog.Trace/PDBs/DatadogMetadataReader.Dnlib.cs +++ b/tracer/src/Datadog.Trace/PDBs/DatadogMetadataReader.Dnlib.cs @@ -212,7 +212,7 @@ private CustomDebugInfoAsyncAndClosure GetAsyncAndClosureCustomDebugInfoDnlib(in { cdiAsyncAndClosure.EncLambdaAndClosureMap = true; } - else if (methodCustomDebugInfo.Kind is PdbCustomDebugInfoKind.StateMachineHoistedLocalScopes) + else if (methodCustomDebugInfo.Kind is PdbCustomDebugInfoKind.AsyncMethod) { cdiAsyncAndClosure.StateMachineHoistedLocal = true; cdiAsyncAndClosure.StateMachineKickoffMethodRid = (int)((PdbAsyncMethodCustomDebugInfo)methodCustomDebugInfo).KickoffMethod.MDToken.Rid;