in src/Microsoft.Diagnostics.Runtime/Utilities/PEImage/PEImage.cs [717:769]
private ImmutableArray<PdbInfo> ReadPdbs()
{
try
{
ImageDataDirectory debugDirectory = DebugDataDirectory;
if (debugDirectory.VirtualAddress != 0 && debugDirectory.Size != 0)
{
int count = debugDirectory.Size / sizeof(ImageDebugDirectory);
int offset = RvaToOffset(debugDirectory.VirtualAddress);
if (offset == -1)
return ImmutableArray<PdbInfo>.Empty;
SeekTo(offset);
ImmutableArray<PdbInfo>.Builder result = ImmutableArray.CreateBuilder<PdbInfo>(count);
for (int i = 0; i < count; i++)
{
if (!TryRead(ref offset, out ImageDebugDirectory directory))
break;
if (directory.Type == ImageDebugType.CODEVIEW && directory.SizeOfData >= sizeof(CvInfoPdb70))
{
int ptr = _isVirtual ? directory.AddressOfRawData : directory.PointerToRawData;
if (TryRead(ptr, out int sig) && sig == CvInfoPdb70.PDB70CvSignature)
{
Guid guid = Read<Guid>();
int age = Read<int>();
// sizeof(sig) + sizeof(guid) + sizeof(age) - [null char] = 0x18 - 1
int nameLen = directory.SizeOfData - 0x18 - 1;
string? path = ReadString(nameLen);
if (path != null)
{
PdbInfo pdb = new(path, guid, age);
result.Add(pdb);
}
}
}
}
return result.MoveOrCopyToImmutable();
}
}
catch (IOException)
{
}
catch (InvalidDataException)
{
}
return ImmutableArray<PdbInfo>.Empty;
}