Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3f39bb8
Fix Debugger Windows integration tests
andrewlock Mar 11, 2025
45596c9
Fix NRE when trying to build a probe in the pre test probes builder
dudikeleti Mar 25, 2025
8ae9769
Fix log path for tests
dudikeleti Mar 26, 2025
ae4539e
Improve WaitForLogEntries error reporting with detailed diagnostics
dudikeleti May 7, 2025
705cd01
fix build
dudikeleti May 7, 2025
644e2ff
try to see how does it affect the test in the CI
dudikeleti May 7, 2025
7b996e2
stabilize debugger tests
dudikeleti May 8, 2025
354a5ec
Try to fix missing file url and approval file
dudikeleti May 9, 2025
5a63a08
kip on netframework
dudikeleti May 9, 2025
693bf45
skip on .net framework
dudikeleti May 13, 2025
a26a2a4
Add log for debug CI errors
dudikeleti May 13, 2025
2900be4
fix trailing whitespace
dudikeleti May 13, 2025
efbc324
fix test and add logs
dudikeleti May 13, 2025
da65a15
datadog metadata reader should accept only metadata tokens and not ro…
dudikeleti May 14, 2025
cf93da5
fix snapshots and filter tests for some .net versions
dudikeleti May 14, 2025
7ea1202
reducing noise in tests
dudikeleti May 19, 2025
9865484
skip problematic tests
dudikeleti May 19, 2025
896c2a7
skip more tests in some conditions
dudikeleti May 20, 2025
4e61aa4
add skippable attribute
dudikeleti May 20, 2025
59c0150
more tests adjusments
dudikeleti May 20, 2025
089a2c2
more skips
dudikeleti May 21, 2025
e840b76
fix build
dudikeleti May 22, 2025
e2d12a6
Revert "Improve WaitForLogEntries error reporting with detailed diagn…
dudikeleti May 22, 2025
054166d
Skip more tests
dudikeleti May 22, 2025
8ae943b
skip more tests
dudikeleti May 22, 2025
56c0971
leftover
dudikeleti May 22, 2025
521bffa
fix build
dudikeleti May 22, 2025
eabd4f0
Hopefully last one
dudikeleti May 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion tracer/build/_build/Build.Steps.Debugger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ string GetTestFilter()
_ => "(Category!=LinuxUnsupported)&(SkipInCI!=True)",
};

return Filter is null ? filter : $"{Filter}&{filter}";
return string.IsNullOrEmpty(Filter) ? filter : $"{Filter}&{filter}";
}
}
finally
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ internal static ImmutableHashSet<int> GetEndpointMethodTokens(DatadogMetadataRea
isSignalRHub = IsInheritFromTypes(typeDef, metadataReader, SignalRHubBaseNames);
if (!isSignalRHub)
{
isCompilerGeneratedType = datadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnType(typeHandle.RowId);
isCompilerGeneratedType = datadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnType(MetadataTokens.GetToken(typeHandle));
if (!isCompilerGeneratedType)
{
continue;
Expand Down
15 changes: 9 additions & 6 deletions tracer/src/Datadog.Trace/Debugger/Symbols/SymbolExtractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
using Datadog.Trace.VendoredMicrosoftCode.System.Buffers;
using Datadog.Trace.VendoredMicrosoftCode.System.Collections.Immutable;
using Datadog.Trace.VendoredMicrosoftCode.System.Reflection.Metadata;
using Datadog.Trace.VendoredMicrosoftCode.System.Reflection.Metadata.Ecma335;

namespace Datadog.Trace.Debugger.Symbols
{
Expand Down Expand Up @@ -167,7 +168,7 @@ private bool TryGetClassSymbols(TypeDefinitionHandle typeDefinitionHandle, out M
return false;
}

if (DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnType(typeDefinitionHandle.RowId))
if (DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnType(MetadataTokens.GetToken(typeDefinitionHandle)))
{
return false;
}
Expand Down Expand Up @@ -352,7 +353,7 @@ private void PopulateNestedNotCompileGeneratedClassScope(ImmutableArray<TypeDefi
continue;
}

if (DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnType(typeHandle.RowId))
if (DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnType(MetadataTokens.GetToken(typeHandle)))
{
continue;
}
Expand Down Expand Up @@ -459,12 +460,14 @@ private void PopulateMethodScopes(TypeDefinition type, MethodDefinitionHandleCol
continue;
}

if (DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnMethod(methodDefHandle.RowId))
var methodToken = MetadataTokens.GetToken(methodDefHandle);

if (DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnMethod(methodToken))
{
continue;
}

if (!DatadogMetadataReader.HasMethodBody(methodDefHandle.RowId))
if (!DatadogMetadataReader.HasMethodBody(methodToken))
{
continue;
}
Expand Down Expand Up @@ -632,7 +635,7 @@ protected virtual bool TryCreateMethodScope(TypeDefinition type, MethodDefinitio

for (int i = 0; i < nestedTypes.Length; i++)
{
if (!DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnType(nestedTypes[i].RowId))
if (!DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnType(MetadataTokens.GetToken(nestedTypes[i])))
{
continue;
}
Expand All @@ -658,7 +661,7 @@ protected virtual bool TryCreateMethodScope(TypeDefinition type, MethodDefinitio
continue;
}

if (!DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnMethod(methodHandle.RowId))
if (!DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnMethod(MetadataTokens.GetToken(methodHandle)))
{
continue;
}
Expand Down
28 changes: 16 additions & 12 deletions tracer/src/Datadog.Trace/Debugger/Symbols/SymbolPdbExtractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using Datadog.Trace.VendoredMicrosoftCode.System;
using Datadog.Trace.VendoredMicrosoftCode.System.Buffers;
using Datadog.Trace.VendoredMicrosoftCode.System.Reflection.Metadata;
using Datadog.Trace.VendoredMicrosoftCode.System.Reflection.Metadata.Ecma335;
using Datadog.Trace.VendoredMicrosoftCode.System.Runtime.CompilerServices.Unsafe;
using Datadog.Trace.VendoredMicrosoftCode.System.Runtime.InteropServices;

Expand All @@ -32,7 +33,7 @@ protected override bool TryCreateMethodScope(TypeDefinition type, MethodDefiniti
return false;
}

using var memory = DatadogMetadataReader.GetMethodSequencePointsAsMemoryOwner(method.Handle.RowId, false, out var count);
using var memory = DatadogMetadataReader.GetMethodSequencePointsAsMemoryOwner(MetadataTokens.GetToken(method.Handle), false, out var count);
if (memory == null || count == 0)
{
return true;
Expand All @@ -57,7 +58,7 @@ protected override bool TryCreateMethodScope(TypeDefinition type, MethodDefiniti
methodScope.LanguageSpecifics = ls;
}

var localScopes = GetLocalSymbols(method.Handle.RowId, sequencePoints, methodScope);
var localScopes = GetLocalSymbols(method, sequencePoints, methodScope);
methodScope.Scopes = ConcatMethodScopes(methodScope.Scopes ?? null, localScopes);
return true;
}
Expand Down Expand Up @@ -98,16 +99,17 @@ protected override bool TryCreateMethodScopeForGeneratedMethod(MethodDefinition
return false;
}

if (!DatadogMetadataReader.HasSequencePoints(generatedMethod.Handle.RowId))
var methodToken = MetadataTokens.GetToken(generatedMethod.Handle);
if (!DatadogMetadataReader.HasSequencePoints(methodToken))
{
return false;
}

var cdi = DatadogMetadataReader.GetAsyncAndClosureCustomDebugInfo(generatedMethod.Handle.RowId);
var cdi = DatadogMetadataReader.GetAsyncAndClosureCustomDebugInfo(methodToken);
string? methodName;
if (cdi.StateMachineHoistedLocal && method.Handle.RowId == cdi.StateMachineKickoffMethodRid)
if (cdi.StateMachineHoistedLocal && MetadataTokens.GetToken(method.Handle) == cdi.StateMachineKickoffMethodToken)
{
var kickoffDef = DatadogMetadataReader.GetMethodDef(cdi.StateMachineKickoffMethodRid);
var kickoffDef = DatadogMetadataReader.GetMethodDef(cdi.StateMachineKickoffMethodToken);
methodName = MetadataReader.GetString(kickoffDef.Name);
}
else
Expand Down Expand Up @@ -141,19 +143,21 @@ protected override bool TryCreateMethodScopeForGeneratedMethod(MethodDefinition
return true;
}

private Model.Scope[]? GetLocalSymbols(int rowId, VendoredMicrosoftCode.System.ReadOnlySpan<DatadogMetadataReader.DatadogSequencePoint> sequencePoints, Model.Scope methodScope)
private Model.Scope[]? GetLocalSymbols(MethodDefinition methodDefinition, VendoredMicrosoftCode.System.ReadOnlySpan<DatadogMetadataReader.DatadogSequencePoint> sequencePoints, Model.Scope methodScope)
{
List<Model.Scope>? scopes = null;
var generatedClassPrefix = Datadog.Trace.VendoredMicrosoftCode.System.MemoryExtensions.AsSpan(GeneratedClassPrefix);

if (DatadogMetadataReader.GetAsyncAndClosureCustomDebugInfo(rowId).StateMachineHoistedLocal && DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnType(MetadataReader.GetMethodDefinition(MethodDefinitionHandle.FromRowId(rowId)).GetDeclaringType().RowId))
var methodToken = MetadataTokens.GetToken(methodDefinition.Handle);
if (DatadogMetadataReader.GetAsyncAndClosureCustomDebugInfo(methodToken).StateMachineHoistedLocal
&& DatadogMetadataReader.IsCompilerGeneratedAttributeDefinedOnType(MetadataTokens.GetToken(methodDefinition.GetDeclaringType())))
{
scopes = new List<Model.Scope>();
var scope = new Model.Scope();
using var localsMemory = ArrayMemoryPool<Model.Symbol>.Shared.Rent();
var localIndex = 0;
var localSymbols = localsMemory.Memory.Span;
var fields = MetadataReader.GetTypeDefinition(DatadogMetadataReader.GetMethodDef(rowId).GetDeclaringType()).GetFields();
var fields = MetadataReader.GetTypeDefinition(methodDefinition.GetDeclaringType()).GetFields();
foreach (var fieldHandle in fields)
{
var field = MetadataReader.GetFieldDefinition(fieldHandle);
Expand Down Expand Up @@ -222,7 +226,7 @@ protected override bool TryCreateMethodScopeForGeneratedMethod(MethodDefinition
scopes.Add(scope);
}

var localScopes = DatadogMetadataReader.GetLocalSymbols(rowId, sequencePoints, false);
var localScopes = DatadogMetadataReader.GetLocalSymbols(methodToken, sequencePoints, false);
if (localScopes is not { Length: > 0 })
{
return scopes?.ToArray();
Expand All @@ -245,10 +249,10 @@ protected override bool TryCreateMethodScopeForGeneratedMethod(MethodDefinition

if (Datadog.Trace.VendoredMicrosoftCode.System.MemoryExtensions.IndexOf(nameAsSpan, generatedClassPrefix, StringComparison.Ordinal) > 0)
{
var cdi = DatadogMetadataReader.GetAsyncAndClosureCustomDebugInfo(rowId);
var cdi = DatadogMetadataReader.GetAsyncAndClosureCustomDebugInfo(methodToken);
if (cdi.EncLambdaAndClosureMap || cdi.LocalSlot)
{
var nestedTypes = MetadataReader.GetTypeDefinition(DatadogMetadataReader.GetMethodDef(rowId).GetDeclaringType()).GetNestedTypes();
var nestedTypes = MetadataReader.GetTypeDefinition(methodDefinition.GetDeclaringType()).GetNestedTypes();
for (int i = 0; i < nestedTypes.Length; i++)
{
var nestedHandle = nestedTypes[i];
Expand Down
41 changes: 23 additions & 18 deletions tracer/src/Datadog.Trace/PDBs/DatadogMetadataReader.Dnlib.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ internal partial class DatadogMetadataReader : IDisposable

private SymbolReader? DnlibPdbReader { get; }

private MethodDef? GetMethodDefDnlib(uint methodRid)
private MethodDef? GetMethodDefDnlib(int methodToken)
{
return _dnlibModule?.ResolveMethod(methodRid);
return _dnlibModule?.ResolveMethod((uint)RidOf(methodToken));
}

private List<SymbolScope>? GetAllScopes(uint methodRid, bool searchMoveNext)
private List<SymbolScope>? GetAllScopes(int methodToken, bool searchMoveNext)
{
var method = GetSymbolMethodDnlib(methodRid, searchMoveNext);
var method = GetSymbolMethodDnlib(methodToken, searchMoveNext);
if (method == null)
{
return null;
Expand All @@ -59,9 +59,9 @@ void RetrieveAllNestedScopes(SymbolScope? scope, List<SymbolScope> scopes)
}
}

private string[]? GetLocalVariableNamesDnlib(int methodRid, int localVariablesCount, bool searchMoveNext)
private string[]? GetLocalVariableNamesDnlib(int methodToken, int localVariablesCount, bool searchMoveNext)
{
if (GetSymbolMethodDnlib((uint)methodRid, searchMoveNext) is not { } symbolMethod)
if (GetSymbolMethodDnlib(methodToken, searchMoveNext) is not { } symbolMethod)
{
return null;
}
Expand Down Expand Up @@ -89,9 +89,14 @@ void RetrieveAllNestedScopes(SymbolScope? scope, List<SymbolScope> scopes)
return localNames;
}

private SymbolMethod? GetSymbolMethodDnlib(uint methodRid, bool searchMoveNext)
private SymbolMethod? GetSymbolMethodDnlib(int methodToken, bool searchMoveNext)
{
var mdMethod = GetMethodDefDnlib(methodRid);
var mdMethod = GetMethodDefDnlib(methodToken);
if (mdMethod == null)
{
return null;
}

return searchMoveNext ? (GetSymbolMethodOfAsyncMethodDnlib(mdMethod) ?? DnlibPdbReader?.GetMethod(mdMethod, version: 1)) : DnlibPdbReader?.GetMethod(mdMethod, version: 1);
}

Expand All @@ -114,17 +119,17 @@ void RetrieveAllNestedScopes(SymbolScope? scope, List<SymbolScope> scopes)
return DnlibPdbReader?.GetMethod(breakpointMethod.Value.BreakpointMethod, version: 1);
}

private ImmutableArray<LocalScope>? GetLocalSymbolsDnlib(int methodRid, VendoredMicrosoftCode.System.ReadOnlySpan<DatadogSequencePoint> sequencePoints, bool searchMoveNext)
private ImmutableArray<LocalScope>? GetLocalSymbolsDnlib(int methodToken, VendoredMicrosoftCode.System.ReadOnlySpan<DatadogSequencePoint> sequencePoints, bool searchMoveNext)
{
ImmutableArray<LocalScope>.Builder? localScopes = null;
var method = GetMethodDefDnlib((uint)methodRid);
var method = GetMethodDefDnlib(methodToken);
if (method!.Body is not { Variables.Count: > 0 })
{
return null;
}

var methodLocals = method.Body.Variables;
var allMethodScopes = GetAllScopes(method.MDToken.Rid, searchMoveNext);
var allMethodScopes = GetAllScopes(method.MDToken.ToInt32(), searchMoveNext);
if (allMethodScopes == null)
{
return null;
Expand Down Expand Up @@ -197,10 +202,10 @@ void RetrieveAllNestedScopes(SymbolScope? scope, List<SymbolScope> scopes)
return localScopes.ToImmutable();
}

private CustomDebugInfoAsyncAndClosure GetAsyncAndClosureCustomDebugInfoDnlib(int methodRid)
private CustomDebugInfoAsyncAndClosure GetAsyncAndClosureCustomDebugInfoDnlib(int methodToken)
{
CustomDebugInfoAsyncAndClosure cdiAsyncAndClosure = default;
Datadog.Trace.Vendors.dnlib.DotNet.MethodDef? method = GetMethodDefDnlib((uint)methodRid);
Datadog.Trace.Vendors.dnlib.DotNet.MethodDef? method = GetMethodDefDnlib(methodToken);
if (method is not { HasCustomDebugInfos: true })
{
return cdiAsyncAndClosure;
Expand All @@ -215,7 +220,7 @@ private CustomDebugInfoAsyncAndClosure GetAsyncAndClosureCustomDebugInfoDnlib(in
else if (methodCustomDebugInfo.Kind is PdbCustomDebugInfoKind.AsyncMethod)
{
cdiAsyncAndClosure.StateMachineHoistedLocal = true;
cdiAsyncAndClosure.StateMachineKickoffMethodRid = (int)((PdbAsyncMethodCustomDebugInfo)methodCustomDebugInfo).KickoffMethod.MDToken.Rid;
cdiAsyncAndClosure.StateMachineKickoffMethodToken = ((PdbAsyncMethodCustomDebugInfo)methodCustomDebugInfo).KickoffMethod.MDToken.ToInt32();
}
}

Expand All @@ -239,10 +244,10 @@ private CustomDebugInfoAsyncAndClosure GetAsyncAndClosureCustomDebugInfoDnlib(in
return sourceLink == null ? null : Encoding.UTF8.GetString(sourceLink.FileBlob);
}

private IMemoryOwner<DatadogSequencePoint>? GetMethodSequencePointsDnlib(int methodRid, bool searchMoveNext, out int count)
private IMemoryOwner<DatadogSequencePoint>? GetMethodSequencePointsDnlib(int methodToken, bool searchMoveNext, out int count)
{
count = 0;
var symbolMethod = GetSymbolMethodDnlib((uint)methodRid, searchMoveNext);
var symbolMethod = GetSymbolMethodDnlib(methodToken, searchMoveNext);
if (symbolMethod == null)
{
return null;
Expand Down Expand Up @@ -276,9 +281,9 @@ private CustomDebugInfoAsyncAndClosure GetAsyncAndClosureCustomDebugInfoDnlib(in
return memory;
}

private DatadogSequencePoint? GetMethodSourceLocationDnlib(int methodRid, bool searchMoveNext)
private DatadogSequencePoint? GetMethodSourceLocationDnlib(int methodToken, bool searchMoveNext)
{
var symbolMethod = GetSymbolMethodDnlib((uint)methodRid, searchMoveNext);
var symbolMethod = GetSymbolMethodDnlib(methodToken, searchMoveNext);
if (symbolMethod == null)
{
return null;
Expand Down
Loading
Loading