public ISymbolReader GetSymbolReader(ModuleDefinition module, string fileName) { if (module.Image.HasDebugTables()) { return(null); } if (module.HasDebugHeader) { var header = module.GetDebugHeader(); var entry = header.GetEmbeddedPortablePdbEntry(); if (entry != null) { return(new EmbeddedPortablePdbReaderProvider().GetSymbolReader(module, fileName)); } } var pdb_file_name = Mixin.GetPdbFileName(fileName); if (File.Exists(pdb_file_name)) { if (Mixin.IsPortablePdb(Mixin.GetPdbFileName(fileName))) { return(new PortablePdbReaderProvider().GetSymbolReader(module, fileName)); } try { return(SymbolProvider.GetReaderProvider(SymbolKind.NativePdb).GetSymbolReader(module, fileName)); } catch (Exception) { // We might not include support for native pdbs. } } var mdb_file_name = Mixin.GetMdbFileName(fileName); if (File.Exists(mdb_file_name)) { try { return(SymbolProvider.GetReaderProvider(SymbolKind.Mdb).GetSymbolReader(module, fileName)); } catch (Exception) { // We might not include support for mdbs. } } if (throw_if_no_symbol) { throw new SymbolsNotFoundException(string.Format("No symbol found for file: {0}", fileName)); } return(null); }
public ISymbolReader GetSymbolReader(ModuleDefinition module, Stream symbolStream) { if (module.Image.HasDebugTables()) { return(null); } if (module.HasDebugHeader) { var header = module.GetDebugHeader(); var entry = header.GetEmbeddedPortablePdbEntry(); if (entry != null) { return(new EmbeddedPortablePdbReaderProvider().GetSymbolReader(module, "")); } } Mixin.CheckStream(symbolStream); Mixin.CheckReadSeek(symbolStream); var position = symbolStream.Position; const int portablePdbHeader = 0x424a5342; var reader = new BinaryStreamReader(symbolStream); var intHeader = reader.ReadInt32(); symbolStream.Position = position; if (intHeader == portablePdbHeader) { return(new PortablePdbReaderProvider().GetSymbolReader(module, symbolStream)); } const string nativePdbHeader = "Microsoft C/C++ MSF 7.00"; var bytesHeader = reader.ReadBytes(nativePdbHeader.Length); symbolStream.Position = position; var isNativePdb = true; for (var i = 0; i < bytesHeader.Length; i++) { if (bytesHeader [i] != (byte)nativePdbHeader [i]) { isNativePdb = false; break; } } if (isNativePdb) { try { return(SymbolProvider.GetReaderProvider(SymbolKind.NativePdb).GetSymbolReader(module, symbolStream)); } catch (Exception) { // We might not include support for native pdbs. } } const long mdbHeader = 0x45e82623fd7fa614; var longHeader = reader.ReadInt64(); symbolStream.Position = position; if (longHeader == mdbHeader) { try { return(SymbolProvider.GetReaderProvider(SymbolKind.Mdb).GetSymbolReader(module, symbolStream)); } catch (Exception) { // We might not include support for mdbs. } } if (throw_if_no_symbol) { throw new SymbolsNotFoundException(string.Format("No symbols found in stream")); } return(null); }