Skip to content

Commit 328ee1f

Browse files
committed
Handle exception during opening a pdb file
1 parent 1b25f92 commit 328ee1f

File tree

3 files changed

+35
-22
lines changed

3 files changed

+35
-22
lines changed

tracer/src/Datadog.Trace/Debugger/SpanCodeOrigin/EndpointDetector.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ internal static class EndpointDetector
5656

5757
internal static ImmutableHashSet<int> GetEndpointMethodTokens(DatadogMetadataReader datadogMetadataReader)
5858
{
59+
ThrowHelper.ThrowArgumentNullException(nameof(datadogMetadataReader));
5960
var builder = ImmutableHashSet.CreateBuilder<int>();
6061
var metadataReader = datadogMetadataReader.MetadataReader;
6162
foreach (var typeHandle in metadataReader.TypeDefinitions)

tracer/src/Datadog.Trace/Debugger/Symbols/SymbolExtractor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ protected SymbolExtractor(DatadogMetadataReader metadataReader, string assemblyP
8080

8181
if (datadogMetadataReader.MetadataReader.TypeDefinitions.Count == 0)
8282
{
83-
Log.Debug("Could not found any type in assembly {Assembly}", assembly.FullName);
83+
Log.Debug("Could not find any type in assembly {Assembly}", assembly.FullName);
8484
return null;
8585
}
8686

tracer/src/Datadog.Trace/PDBs/DatadogMetadataReader.cs

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -73,33 +73,45 @@ private DatadogMetadataReader(PEReader peReader, MetadataReader metadataReader,
7373
return null;
7474
}
7575

76-
// For metadata we are always using System.Reflection.Metadata
77-
// For PDB, Reflection.Metadata for portable and embedded PDB and dnlib for windows PDB
78-
var peReader = new PEReader(File.OpenRead(assembly.Location), PEStreamOptions.PrefetchMetadata | PEStreamOptions.PrefetchEntireImage);
79-
MetadataReader metadataReader = peReader.GetMetadataReader(MetadataReaderOptions.Default);
80-
MetadataReader? pdbReader;
81-
if (peReader.TryOpenAssociatedPortablePdb(assembly.Location, File.OpenRead, out var metadataReaderProvider, out var pdbPath))
76+
try
8277
{
83-
pdbReader = metadataReaderProvider!.GetMetadataReader(MetadataReaderOptions.Default, MetadataStringDecoder.DefaultUTF8);
84-
return new DatadogMetadataReader(peReader, metadataReader, pdbReader, pdbPath ?? assembly.Location, null, null);
85-
}
78+
// For metadata we are always using System.Reflection.Metadata
79+
// For PDB, Reflection.Metadata for portable and embedded PDB and dnlib for windows PDB
80+
var peReader = new PEReader(File.OpenRead(assembly.Location), PEStreamOptions.PrefetchMetadata | PEStreamOptions.PrefetchEntireImage);
81+
MetadataReader metadataReader = peReader.GetMetadataReader(MetadataReaderOptions.Default);
82+
if (peReader.TryOpenAssociatedPortablePdb(assembly.Location, File.OpenRead, out var metadataReaderProvider, out var pdbPath))
83+
{
84+
var pdbReader = metadataReaderProvider!.GetMetadataReader(MetadataReaderOptions.Default, MetadataStringDecoder.DefaultUTF8);
85+
return new DatadogMetadataReader(peReader, metadataReader, pdbReader, pdbPath ?? assembly.Location, null, null);
86+
}
87+
88+
if (!TryFindPdbFile(assembly.Location, out var pdbFullPath))
89+
{
90+
return new DatadogMetadataReader(peReader, metadataReader, null, null, null, null);
91+
}
92+
93+
var module = Datadog.Trace.Vendors.dnlib.DotNet.ModuleDefMD.Load(assembly.ManifestModule, new Datadog.Trace.Vendors.dnlib.DotNet.ModuleCreationOptions { TryToLoadPdbFromDisk = false });
94+
var pdbStream = Datadog.Trace.Vendors.dnlib.IO.DataReaderFactoryFactory.Create(pdbFullPath, false);
95+
var dnlibReader = Datadog.Trace.Vendors.dnlib.DotNet.Pdb.SymbolReaderFactory.Create(Datadog.Trace.Vendors.dnlib.DotNet.ModuleCreationOptions.DefaultPdbReaderOptions, module.Metadata, pdbStream);
96+
if (dnlibReader == null)
97+
{
98+
return new DatadogMetadataReader(peReader, metadataReader, null, null, null, null);
99+
}
86100

87-
if (!TryFindPdbFile(assembly.Location, out var pdbFullPath))
101+
dnlibReader.Initialize(module);
102+
module.LoadPdb(dnlibReader);
103+
return new DatadogMetadataReader(peReader, metadataReader, null, pdbFullPath, dnlibReader, module);
104+
}
105+
catch (IOException e)
88106
{
89-
return new DatadogMetadataReader(peReader, metadataReader, null, null, null, null);
107+
Logger.Debug("Error while trying to get a pdb for {Assembly} in location: {AssemblyLocation}. Error: {Error}", assembly.FullName, assembly.Location, e.Message);
108+
return null;
90109
}
91-
92-
var module = Datadog.Trace.Vendors.dnlib.DotNet.ModuleDefMD.Load(assembly.ManifestModule, new Datadog.Trace.Vendors.dnlib.DotNet.ModuleCreationOptions { TryToLoadPdbFromDisk = false });
93-
var pdbStream = Datadog.Trace.Vendors.dnlib.IO.DataReaderFactoryFactory.Create(pdbFullPath, false);
94-
var dnlibReader = Datadog.Trace.Vendors.dnlib.DotNet.Pdb.SymbolReaderFactory.Create(Datadog.Trace.Vendors.dnlib.DotNet.ModuleCreationOptions.DefaultPdbReaderOptions, module.Metadata, pdbStream);
95-
if (dnlibReader == null)
110+
catch (Exception e)
96111
{
97-
return new DatadogMetadataReader(peReader, metadataReader, null, null, null, null);
112+
Logger.Error(e, "Error while trying to get a pdb for {Assembly} in location: {AssemblyLocation}", assembly.FullName, assembly.Location);
113+
return null;
98114
}
99-
100-
dnlibReader.Initialize(module);
101-
module.LoadPdb(dnlibReader);
102-
return new DatadogMetadataReader(peReader, metadataReader, null, pdbFullPath, dnlibReader, module);
103115
}
104116

105117
private static bool TryFindPdbFile(string assemblyLocation, [NotNullWhen(true)] out string? pdbFullPath)

0 commit comments

Comments
 (0)