Ejemplo n.º 1
0
        private GuidStream GetGuidStream(FileChecksumSubsection checksum, PdbStringTable namesStream, PdbFile pdb)
        {
            string name = namesStream.Dictionary[checksum.NameIndex];
            int    guidStreamIndex;

            if (pdb.InfoStream.NamedStreamMap.Streams.TryGetValue("/src/files/" + name, out guidStreamIndex) ||
                pdb.InfoStream.NamedStreamMap.StreamsUppercase.TryGetValue("/SRC/FILES/" + name.ToUpperInvariant(), out guidStreamIndex))
            {
                return(new GuidStream(pdb.Streams[guidStreamIndex]));
            }
            return(null);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Reads debug subsections from references for the specified index.
        /// </summary>
        /// <param name="index">Index of the debug subsection.</param>
        private DebugSubsection GetDebugSubsection(int index)
        {
            // Since DictionaryCache is allowing only single thread to call this function, we don't need to lock reader here.
            DebugSubsectionReference reference = references[index];

            Reader.Position = reference.DataOffset;
            switch (reference.Kind)
            {
            case DebugSubsectionKind.Lines:
                return(LinesSubsection.Read(Reader, reference.Kind, reference.DataLen));

            case DebugSubsectionKind.FileChecksums:
                return(FileChecksumSubsection.Read(Reader, reference.Kind));

            default:
#if DEBUG
                throw new NotImplementedException($"Unknown reference kind: {reference.Kind}");
#else
                return(null);
#endif
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="PdbSource"/> class.
        /// </summary>
        /// <param name="pdbFile">Portable PDB file reader.</param>
        /// <param name="checksum">File checksum subsection.</param>
        internal PdbSource(PdbFile pdbFile, FileChecksumSubsection checksum)
        {
            PdbFile         = pdbFile;
            Checksum        = checksum;
            hashCache       = SimpleCache.CreateStruct(() => GuidStream?.ChecksumReader.ReadAllBytes() ?? Checksum.HashReader.ReadAllBytes());
            nameCache       = SimpleCache.CreateStruct(() => PdbFile.NamesStream.Dictionary[checksum.NameIndex]);
            guidStreamCache = SimpleCache.CreateStruct(() =>
            {
                int guidStreamIndex;

                if (PdbFile.Reader.InfoStream.NamedStreamMap.Streams.TryGetValue("/src/files/" + Name, out guidStreamIndex) ||
                    PdbFile.Reader.InfoStream.NamedStreamMap.StreamsUppercase.TryGetValue("/SRC/FILES/" + Name.ToUpperInvariant(), out guidStreamIndex))
                {
                    PdbStream guidStream = PdbFile.Reader.GetStream(guidStreamIndex);

                    if (guidStream != null)
                    {
                        return(new GuidStream(guidStream));
                    }
                }
                return(null);
            });
        }
Ejemplo n.º 4
0
 internal PdbSource this[FileChecksumSubsection checksum] => sourcesCache[checksum];