private ImmutableArray ReadPdbs()

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;
        }