public static SymbolReader Create(PdbReaderOptions options, Metadata metadata, byte[] pdbData)
        {
            var pdbContext = new PdbReaderContext(metadata.PEImage, options);

            if (!pdbContext.HasDebugInfo)
            {
                return(null);
            }
            return(CreateCore(pdbContext, metadata, ByteArrayDataReaderFactory.Create(pdbData, filename: null)));
        }
        public static SymbolReader Create(PdbReaderOptions options, Metadata metadata, string pdbFileName)
        {
            var pdbContext = new PdbReaderContext(metadata.PEImage, options);

            if (!pdbContext.HasDebugInfo)
            {
                return(null);
            }
            return(CreateCore(pdbContext, metadata, DataReaderFactoryUtils.TryCreateDataReaderFactory(pdbFileName)));
        }
        public static SymbolReader TryCreateEmbeddedPdbReader(PdbReaderOptions options, Metadata metadata)
        {
            var pdbContext = new PdbReaderContext(metadata.PEImage, options);

            if (!pdbContext.HasDebugInfo)
            {
                return(null);
            }
            return(TryCreateEmbeddedPortablePdbReader(pdbContext, metadata));
        }
Example #4
0
        static ISymUnmanagedReader CreateSymUnmanagedReader(PdbReaderOptions options)
        {
            bool useDiaSymReader    = (options & PdbReaderOptions.NoDiaSymReader) == 0;
            bool useOldDiaSymReader = (options & PdbReaderOptions.NoOldDiaSymReader) == 0;

            if (useDiaSymReader && canTry_Microsoft_DiaSymReader_Native)
            {
                try {
                    var    guid = CLSID_CorSymReader_SxS;
                    object symReaderObj;
                    var    machine = ProcessorArchUtils.GetProcessCpuArchitecture();
                    switch (machine)
                    {
                    case Machine.AMD64:
                        CreateSymReader_x64(ref guid, out symReaderObj);
                        break;

                    case Machine.I386:
                        CreateSymReader_x86(ref guid, out symReaderObj);
                        break;

                    case Machine.ARMNT:
                        CreateSymReader_arm(ref guid, out symReaderObj);
                        break;

                    case Machine.ARM64:
                        CreateSymReader_arm64(ref guid, out symReaderObj);
                        break;

                    default:
                        Debug.Fail($"Microsoft.DiaSymReader.Native doesn't support this CPU arch: {machine}");
                        symReaderObj = null;
                        break;
                    }
                    if (symReaderObj is ISymUnmanagedReader symReader)
                    {
                        return(symReader);
                    }
                }
                catch (DllNotFoundException) {
                    Debug.WriteLine("Microsoft.DiaSymReader.Native not found, using diasymreader.dll instead");
                }
                catch {
                }
                canTry_Microsoft_DiaSymReader_Native = false;
            }

            if (useOldDiaSymReader)
            {
                return((ISymUnmanagedReader)Activator.CreateInstance(CorSymReader_Type ??= Type.GetTypeFromCLSID(CLSID_CorSymReader_SxS)));
            }

            return(null);
        }
Example #5
0
        public static SymbolReader CreateFromAssemblyFile(PdbReaderOptions options, Metadata metadata, string assemblyFileName)
        {
            var pdbContext = new PdbReaderContext(metadata.PEImage, options);

            if (!pdbContext.HasDebugInfo)
            {
                return(null);
            }
            if (!pdbContext.TryGetCodeViewData(out var guid, out uint age, out var pdbWindowsFilename))
            {
                return(null);
            }

            string pdbFilename;
            int    index = pdbWindowsFilename.LastIndexOfAny(windowsPathSepChars);

            if (index >= 0)
            {
                pdbFilename = pdbWindowsFilename.Substring(index + 1);
            }
            else
            {
                pdbFilename = pdbWindowsFilename;
            }

            string fileToCheck;

            try {
                fileToCheck = assemblyFileName == string.Empty ? pdbFilename : Path.Combine(Path.GetDirectoryName(assemblyFileName), pdbFilename);
                if (!File.Exists(fileToCheck))
                {
                    var ext = Path.GetExtension(pdbFilename);
                    if (string.IsNullOrEmpty(ext))
                    {
                        ext = "pdb";
                    }
                    fileToCheck = Path.ChangeExtension(assemblyFileName, ext);
                }
            }
            catch (ArgumentException) {
                return(null);               // Invalid filename
            }
            return(Create(options, metadata, fileToCheck));
        }
 public PdbReaderContext(IPEImage peImage, PdbReaderOptions options)
 {
     this.peImage     = peImage;
     Options          = options;
     codeViewDebugDir = TryGetDebugDirectoryEntry(peImage, ImageDebugType.CodeView);
 }
        public static SymbolReader Create(PdbReaderOptions options, Metadata metadata, DataReaderFactory pdbStream)
        {
            var pdbContext = new PdbReaderContext(metadata.PEImage, options);

            return(CreateCore(pdbContext, metadata, pdbStream));
        }
        public void ExtractAndAnnotateHelixSequences()
        {
            var directory        = @"G:\Projects\HumanGenome\Protein-PDBs\HumanProteins\SingleChain\FullyPositioned\ByProtein";
            var outputFilePath   = @"G:\Projects\HumanGenome\Protein-PDBs\HumanProteins\humanFullyPositionedSingleChainUniqueProteinHelixMarked.txt";
            var pdbLookupFiles   = Directory.EnumerateFiles(directory, "*.csv");
            var pdbReaderOptions = new PdbReaderOptions {
                MaximumModelCount = 1, BuildMolecule = false
            };
            var outputLock = new object();

            File.Delete(outputFilePath);
            Parallel.ForEach(pdbLookupFiles, pdbLookupFile =>
            {
                var pdbFilePaths             = File.ReadAllLines(pdbLookupFile);
                var proteinOutput            = new List <string>();
                var maxProteinAminoAcidCount = 0;
                foreach (var pdbFilePath in pdbFilePaths)
                {
                    try
                    {
                        var pdbResult = PdbReader.ReadFile(pdbFilePath, pdbReaderOptions);
                        if (!pdbResult.Models.Any())
                        {
                            return;
                        }
                        var firstModel = pdbResult.Models.First();
                        if (!firstModel.Chains.Any())
                        {
                            return;
                        }
                        var hasHelixAnnotations = firstModel.Chains
                                                  .SelectMany(chain => chain.Annotations)
                                                  .Any(annotation => annotation.Type == PeptideSecondaryStructure.AlphaHelix);
                        if (!hasHelixAnnotations)
                        {
                            return;
                        }
                        var aminoAcidCount = firstModel.Chains.Sum(chain => chain.AminoAcids.Count);
                        if (aminoAcidCount <= maxProteinAminoAcidCount)
                        {
                            return;
                        }

                        proteinOutput.Clear();
                        proteinOutput.Add("#" + Path.GetFileNameWithoutExtension(pdbFilePath));
                        foreach (var chain in pdbResult.Models.First().Chains)
                        {
                            var helixAnnotations = chain.Annotations.Where(annot => annot.Type == PeptideSecondaryStructure.AlphaHelix).ToList();
                            var fullSequence     = AlphaHelixAnnotationTool.GetFullSequence(chain, helixAnnotations);
                            //var helixSequence = AlphaHelixAnnotationTool.GetHelixSequences(helixAnnotations);
                            proteinOutput.Add(fullSequence);
                        }

                        maxProteinAminoAcidCount = aminoAcidCount;
                    }
                    catch (Exception e)
                    {
                        var errorMessage = $"Exception: {e.Message}(Path: {pdbFilePath})";
                        Console.WriteLine(errorMessage);
                        File.AppendAllLines(@"C:\Temp\errors.txt", new [] { errorMessage });
                    }
                }
                lock (outputLock)
                {
                    File.AppendAllLines(outputFilePath, proteinOutput);
                }
            });
        }