Skip to content

Instantly share code, notes, and snippets.

@bgrainger
Last active March 21, 2021 05:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bgrainger/8ade382c7b8b05498a1f473762fe02fb to your computer and use it in GitHub Desktop.
Save bgrainger/8ade382c7b8b05498a1f473762fe02fb to your computer and use it in GitHub Desktop.
Reading Portable PDBs with System.Reflection.Metadata

Reading Embedded Portable PDBs

This example shows how to read an embedded portable PDB file using the System.Reflection.Metadata classes.

void Main()
{
var peFilePath = @"C:\path\file.dll";
using var stream = File.OpenRead(peFilePath);
using var peReader = new PEReader(stream);
var embeddedEntries = peReader.ReadDebugDirectory().Where(x => x.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
var provider = peReader.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedEntries.Single());
var pdbReader = provider.GetMetadataReader();
foreach (var methodDebugInfoHandle in pdbReader.MethodDebugInformation)
{
var debugInfo = pdbReader.GetMethodDebugInformation(methodDebugInfoHandle);
foreach (var sequencePoint in debugInfo.GetSequencePoints())
{
var document = pdbReader.GetDocument(sequencePoint.Document);
var fileName = GetDocumentName(pdbReader, document.Name);
}
}
}
public string GetDocumentName(MetadataReader reader, DocumentNameBlobHandle handle)
{
var blobReader = reader.GetBlobReader(handle);
var separator = (char) blobReader.ReadByte();
string name = "";
while (blobReader.Offset < blobReader.Length)
{
var partHandle = blobReader.ReadBlobHandle();
if (name.Length != 0)
name += separator;
name += Encoding.ASCII.GetString(reader.GetBlobBytes(partHandle));
}
return name;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment