Beispiel #1
0
        /*
         * uint Magic = 0x53445352;
         * Guid Signature;
         * uint Age;
         * string FileName;
         */

        public bool ProcessDebugHeader(ImageDebugHeader header)
        {
            if (!header.HasEntries)
            {
                return(false);
            }

            using (pdb_file) {
                var info = PdbFile.LoadFunctions(pdb_file.value);

                foreach (var entry in header.Entries)
                {
                    if (!IsMatchingEntry(info, entry))
                    {
                        continue;
                    }

                    foreach (var function in info.Functions)
                    {
                        functions.Add(function.token, function);
                    }

                    return(true);
                }
            }

            return(false);
        }
 public static byte[] GetBytes(this ImageDebugHeader header)
 {
     using (var ms = new MemoryStream()) {
         Write(new BinaryWriter(ms), header);
         return(ms.ToArray());
     }
 }
Beispiel #3
0
 /// <summary>Process a debug header in the symbol file.</summary>
 /// <param name="header">The debug header.</param>
 public bool ProcessDebugHeader(ImageDebugHeader header)
 {
     try
     {
         return(this.Reader.ProcessDebugHeader(header));
     }
     catch
     {
         this.Reader.Dispose();
         this.Reader = new PortablePdbReaderProvider().GetSymbolReader(this.Module, this.Stream);
         return(this.Reader.ProcessDebugHeader(header));
     }
 }
Beispiel #4
0
        private void GetDebugHeader()
        {
            ISymbolWriter symbol_writer = metadata.symbol_writer;

            if (symbol_writer != null)
            {
                debug_header = symbol_writer.GetDebugHeader();
            }
            if (module.HasDebugHeader && module.GetDebugHeader().GetDeterministicEntry() != null)
            {
                debug_header = debug_header.AddDeterministicEntry();
            }
        }
 public static void Write(BinaryWriter writer, ImageDebugHeader header)
 {
     writer.Write((byte)header.Entries.Length);
     foreach (var entry in header.Entries)
     {
         var directory = entry.Directory;
         writer.Write(directory.Characteristics);
         writer.Write(directory.TimeDateStamp);
         writer.Write(directory.MajorVersion);
         writer.Write(directory.MinorVersion);
         writer.Write((int)directory.Type);
         writer.Write(directory.SizeOfData);
         writer.Write(entry.Data);
     }
 }
Beispiel #6
0
        /*
         * uint Magic = 0x53445352;
         * Guid Signature;
         * uint Age;
         * string FileName;
         */

        public bool ProcessDebugHeader(ImageDebugHeader header)
        {
            if (!header.HasEntries)
            {
                return(false);
            }

            var entry = header.GetCodeViewEntry();

            if (entry == null)
            {
                return(false);
            }

            var directory = entry.Directory;

            if (directory.Type != ImageDebugType.CodeView)
            {
                return(false);
            }
            if (directory.MajorVersion != 0 || directory.MinorVersion != 0)
            {
                return(false);
            }

            var data = entry.Data;

            if (data.Length < 24)
            {
                return(false);
            }

            var magic = ReadInt32(data, 0);

            if (magic != 0x53445352)
            {
                return(false);
            }

            var guid_bytes = new byte [16];

            Buffer.BlockCopy(data, 4, guid_bytes, 0, 16);

            this.guid = new Guid(guid_bytes);
            this.age  = ReadInt32(data, 20);

            return(PopulateFunctions());
        }
Beispiel #7
0
        public static ImageDebugHeader AddDeterministicEntry(this ImageDebugHeader header)
        {
            var entry = new ImageDebugHeaderEntry(new ImageDebugDirectory {
                Type = ImageDebugType.Deterministic
            }, Empty <byte> .Array);

            if (header == null)
            {
                return(new ImageDebugHeader(entry));
            }

            var entries = new ImageDebugHeaderEntry [header.Entries.Length + 1];

            Array.Copy(header.Entries, entries, header.Entries.Length);
            entries [entries.Length - 1] = entry;
            return(new ImageDebugHeader(entries));
        }
Beispiel #8
0
        private void GetEmbeddedPdb(ImageDebugHeader debugHeader, out byte [] embeddedPdb)
        {
            var entry = Mixin.GetEmbeddedPortablePdbEntry(debugHeader);

            Assert.IsNotNull(entry);

            var compressed_stream = new MemoryStream(entry.Data);
            var reader            = new BinaryStreamReader(compressed_stream);

            Assert.AreEqual(0x4244504D, reader.ReadInt32());
            var length = reader.ReadInt32();
            var decompressed_stream = new MemoryStream(length);

            using (var deflate = new DeflateStream(compressed_stream, CompressionMode.Decompress, leaveOpen: true))
                deflate.CopyTo(decompressed_stream);

            embeddedPdb = decompressed_stream.ToArray();
        }
Beispiel #9
0
        private static ImageDebugHeaderEntry GetEntry(this ImageDebugHeader header, ImageDebugType type)
        {
            if (!header.HasEntries)
            {
                return(null);
            }

            for (var i = 0; i < header.Entries.Length; i++)
            {
                var entry = header.Entries [i];
                if (entry.Directory.Type == type)
                {
                    return(entry);
                }
            }

            return(null);
        }
        void GetDebugHeader()
        {
            var symbol_writer = metadata.symbol_writer;

            if (symbol_writer != null)
            {
                debug_header = symbol_writer.GetDebugHeader();
            }

            if (module.HasDebugHeader)
            {
                var header        = module.GetDebugHeader();
                var deterministic = header.GetDeterministicEntry();
                if (deterministic == null)
                {
                    return;
                }

                debug_header = debug_header.AddDeterministicEntry();
            }
        }
Beispiel #11
0
        private void GetPdbChecksumData(ImageDebugHeader debugHeader, out string algorithmName, out byte [] checksum)
        {
            var entry = Mixin.GetPdbChecksumEntry(debugHeader);

            Assert.IsNotNull(entry);

            var length = Array.IndexOf(entry.Data, (byte)0, 0);
            var bytes  = new byte [length];

            Buffer.BlockCopy(entry.Data, 0, bytes, 0, length);
            algorithmName = Encoding.UTF8.GetString(bytes);
            int checksumSize = 0;

            switch (algorithmName)
            {
            case "SHA256": checksumSize = 32; break;

            case "SHA384": checksumSize = 48; break;

            case "SHA512": checksumSize = 64; break;
            }
            checksum = new byte [checksumSize];
            Buffer.BlockCopy(entry.Data, length + 1, checksum, 0, checksumSize);
        }
Beispiel #12
0
        async Task <MethodInfo> LoadSymbolsOnDemand(AssemblyInfo asm, uint method_token, SessionId sessionId, CancellationToken token)
        {
            var context = GetContext(sessionId);

            if (asm.TriedToLoadSymbolsOnDemand)
            {
                return(null);
            }
            asm.TriedToLoadSymbolsOnDemand = true;
            ImageDebugHeader header = asm.Image.GetDebugHeader();

            for (var i = 0; i < header.Entries.Length; i++)
            {
                var entry = header.Entries[i];
                if (entry.Directory.Type != ImageDebugType.CodeView)
                {
                    continue;
                }

                var data = entry.Data;

                if (data.Length < 24)
                {
                    return(null);
                }

                var pdbSignature = (data[0]
                                    | (data[1] << 8)
                                    | (data[2] << 16)
                                    | (data[3] << 24));

                if (pdbSignature != 0x53445352) // "SDSR" mono/metadata/debug-mono-ppdb.c#L101
                {
                    return(null);
                }

                var buffer = new byte[16];
                Buffer.BlockCopy(data, 4, buffer, 0, 16);

                var pdbAge = (data[20]
                              | (data[21] << 8)
                              | (data[22] << 16)
                              | (data[23] << 24));

                var pdbGuid = new Guid(buffer);
                var buffer2 = new byte[(data.Length - 24) - 1];
                Buffer.BlockCopy(data, 24, buffer2, 0, (data.Length - 24) - 1);
                var pdbName = System.Text.Encoding.UTF8.GetString(buffer2, 0, buffer2.Length);
                pdbName = Path.GetFileName(pdbName);

                foreach (var urlSymbolServer in urlSymbolServerList)
                {
                    var downloadURL = $"{urlSymbolServer}/{pdbName}/{pdbGuid.ToString("N").ToUpper() + pdbAge}/{pdbName}";

                    try
                    {
                        using HttpResponseMessage response = await client.GetAsync(downloadURL);

                        using Stream streamToReadFrom = await response.Content.ReadAsStreamAsync();

                        var portablePdbReaderProvider = new PdbReaderProvider();
                        var symbolReader = portablePdbReaderProvider.GetSymbolReader(asm.Image, streamToReadFrom);
                        asm.ClearDebugInfo(); //workaround while cecil PR #686 is not merged
                        asm.Image.ReadSymbols(symbolReader);
                        asm.Populate();
                        foreach (var source in asm.Sources)
                        {
                            var scriptSource = JObject.FromObject(source.ToScriptSource(context.Id, context.AuxData));
                            SendEvent(sessionId, "Debugger.scriptParsed", scriptSource, token);
                        }
                        return(asm.GetMethodByToken(method_token));
                    }
                    catch (Exception e)
                    {
                        Log("info", $"Unable to load symbols on demand exception: {e.ToString()} url:{downloadURL} assembly: {asm.Name}");
                    }
                }
                break;
            }

            Log("info", "Unable to load symbols on demand assembly: {asm.Name}");
            return(null);
        }
Beispiel #13
0
 public bool ProcessDebugHeader(ImageDebugHeader header)
 {
     return(symbol_file.Guid == module.Mvid);
 }
Beispiel #14
0
 public static ImageDebugHeaderEntry GetEmbeddedPortablePdbEntry(this ImageDebugHeader header)
 {
     return(GetEntry(header, ImageDebugType.EmbeddedPortablePdb));
 }
Beispiel #15
0
 public static ImageDebugHeaderEntry GetPdbChecksumEntry(this ImageDebugHeader header)
 {
     return(GetEntry(header, ImageDebugType.PdbChecksum));
 }
Beispiel #16
0
 public static ImageDebugHeaderEntry GetDeterministicEntry(this ImageDebugHeader header)
 {
     return(GetEntry(header, ImageDebugType.Deterministic));
 }
Beispiel #17
0
 public static ImageDebugHeaderEntry GetCodeViewEntry(this ImageDebugHeader header)
 {
     return(GetEntry(header, ImageDebugType.CodeView));
 }