Example #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="DiaModule"/> class.
        /// </summary>
        /// <param name="pdbPath">The PDB path.</param>
        /// <param name="module">The module.</param>
        public DiaModule(string pdbPath, Module module)
        {
            IDiaSession diaSession;

            dia = DiaLoader.CreateDiaSource();
            dia.loadDataFromPdb(pdbPath);
            dia.openSession(out diaSession);
            Initialize(diaSession, module);
        }
Example #2
0
        /// <summary>
        /// Opens the module for the specified XML module description.
        /// </summary>
        /// <param name="module">The XML module description.</param>
        public static Module Open(XmlModule module)
        {
            IDiaDataSource dia = DiaLoader.CreateDiaSource();
            IDiaSession    session;
            string         moduleName = !string.IsNullOrEmpty(module.Name) ? module.Name : Path.GetFileNameWithoutExtension(module.SymbolsPath).ToLower();

            module.Name = moduleName;
            dia.loadDataFromPdb(module.SymbolsPath);
            dia.openSession(out session);
            return(new DiaModule(module.Name, module.Namespace, dia, session));
        }
Example #3
0
        public void Test1()
        {
            if (!System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows))
            {
                return;
            }

            string         pdbPath = GetPdbPath(1);
            IDiaDataSource dia     = DiaLoader.CreateDiaSource();
            IDiaSession    diaSession;

            dia.loadDataFromPdb(pdbPath);
            dia.openSession(out diaSession);
            using (PdbFile pdb = new PdbFile(pdbPath))
            {
                TestUdts(diaSession, pdb);
            }
        }
Example #4
0
        public override bool IsMatchingPdb(string pdbPath)
        {
            if (m_peFile == null)
            {
                m_peFile = new PEFile(new ReadVirtualStream(m_runtime.DataReader, (long)m_imageBase, (long)m_size), true);
            }

            string pdbName;
            Guid   pdbGuid;
            int    rev;

            if (!m_peFile.GetPdbSignature(out pdbName, out pdbGuid, out rev))
            {
                throw new ClrDiagnosticsException("Failed to get PDB signature from module.", ClrDiagnosticsException.HR.DataRequestError);
            }

            IDiaDataSource source = DiaLoader.GetDiaSourceObject();
            IDiaSession    session;

            source.loadDataFromPdb(pdbPath);
            source.openSession(out session);
            return(pdbGuid == session.globalScope.guid);
        }
Example #5
0
        public static bool PdbMatches(string filePath, Guid pdbIndexGuid, int revision)
        {
            if (File.Exists(filePath))
            {
                Dia2Lib.IDiaDataSource source  = null;
                Dia2Lib.IDiaSession    session = null;
                try
                {
                    source = DiaLoader.GetDiaSourceObject();
                    source.loadDataFromPdb(filePath);
                    source.openSession(out session);

                    if (pdbIndexGuid == session.globalScope.guid && (uint)revision == session.globalScope.age)
                    {
                        return(true);
                    }
                }
                catch (Exception)
                {
                }
                finally
                {
                    if (source != null)
                    {
                        Marshal.ReleaseComObject(source);
                    }

                    if (session != null)
                    {
                        Marshal.ReleaseComObject(session);
                    }
                }
            }

            return(false);
        }
Example #6
0
 public PDBEntry(string pdbPath)
 {
     source = DiaLoader.CreateDiaSource();
     source.loadDataFromPdb(pdbPath);
     source.openSession(out session);
 }
Example #7
0
        public void TestPdb(int pdbIndex)
        {
            if (!System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows))
            {
                return;
            }

            string         pdbPath = GetPdbPath(pdbIndex);
            IDiaDataSource dia     = DiaLoader.CreateDiaSource();
            IDiaSession    diaSession;

            dia.loadDataFromPdb(pdbPath);
            dia.openSession(out diaSession);
            using (PdbFileReader pdb = new PdbFileReader(pdbPath))
            {
                // Verify UDTs
                IReadOnlyList <PdbType> pdbUdts = pdb.UserDefinedTypes;
                IDiaSymbol[]            diaUdts = diaSession.globalScope.GetChildren(SymTagEnum.UDT)
                                                  .Concat(diaSession.globalScope.GetChildren(SymTagEnum.Enum))
                                                  .OrderBy(s => s.constType ? 1 : 0) // Order so that we move types with ModifierRecord to the back
                                                  .ThenBy(s => s.unalignedType ? 1 : 0)
                                                  .ThenBy(s => s.volatileType ? 1 : 0)
                                                  .ToArray();
                HashSet <Tuple <uint, PdbType> > checkedTypes = new HashSet <Tuple <uint, PdbType> >();
                HashSet <string>             checkedUdts      = new HashSet <string>();
                Dictionary <string, PdbType> pdbTypesByName   = new Dictionary <string, PdbType>();

                foreach (PdbType pdbType in pdbUdts)
                {
                    if (!pdbTypesByName.ContainsKey(pdbType.Name))
                    {
                        pdbTypesByName.Add(pdbType.Name, pdbType);
                    }
                }

                foreach (IDiaSymbol diaType in diaUdts)
                {
                    string name = diaType.name;

                    if (!checkedUdts.Contains(name))
                    {
                        PdbType pdbType = pdbTypesByName[name];

                        CompareTypes(diaType, pdbType, checkedTypes);
                        checkedUdts.Add(name);
                    }
                }

                // Verify global variables
                IDiaSymbol[] diaGlobalVariables = diaSession.globalScope.GetChildren(SymTagEnum.Data).Where(s => s.locationType == LocationType.Static).ToArray();

                Assert.Equal(diaGlobalVariables.Length, pdb.GlobalVariables.Length);
                for (int i = 0; i < diaGlobalVariables.Length; i++)
                {
                    IDiaSymbol        diaGlobalVariable = diaGlobalVariables[i];
                    PdbGlobalVariable pdbGlobalVariable = pdb.GlobalVariables[i];

                    Assert.Equal(diaGlobalVariable.name, pdbGlobalVariable.Name);
                    Assert.Equal(diaGlobalVariable.addressSection, pdbGlobalVariable.Segment);
                    Assert.Equal(diaGlobalVariable.addressOffset, pdbGlobalVariable.Offset);
                    Assert.Equal(diaGlobalVariable.relativeVirtualAddress, pdbGlobalVariable.RelativeVirtualAddress);
                    CompareTypes(diaGlobalVariable.type, pdbGlobalVariable.Type, checkedTypes);
                }

                // Verify functions
                IDiaSymbol[] diaFunctions = diaSession.globalScope.GetChildren(SymTagEnum.Function)
                                            .OrderBy(d => d.name)
                                            .ThenBy(d => d.relativeVirtualAddress).ToArray();
                PdbFunction[] pdbFunctions = pdb.Functions
                                             .OrderBy(p => p.Name)
                                             .ThenBy(p => p.RelativeVirtualAddress).ToArray();

                Assert.Equal(diaFunctions.Length, pdbFunctions.Length);
                for (int i = 0; i < diaFunctions.Length; i++)
                {
                    IDiaSymbol  diaFunction = diaFunctions[i];
                    PdbFunction pdbFunction = pdbFunctions[i];

                    Assert.Equal(diaFunction.name, pdbFunction.Name);
                    Assert.Equal(diaFunction.addressSection, pdbFunction.Segment);
                    Assert.Equal(diaFunction.addressOffset, pdbFunction.Offset);
                    Assert.Equal(diaFunction.customCallingConvention, pdbFunction.HasCustomCallingConvention);
                    Assert.Equal(diaFunction.farReturn, pdbFunction.HasFarReturn);
                    Assert.Equal(diaFunction.framePointerPresent, pdbFunction.HasFramePointer);
                    Assert.Equal(diaFunction.interruptReturn, pdbFunction.HasInterruptReturn);
                    Assert.Equal(diaFunction.length, pdbFunction.CodeSize);
                    Assert.Equal(diaFunction.noInline, pdbFunction.IsNoInline);
                    Assert.Equal(diaFunction.notReached, pdbFunction.IsUnreachable);
                    Assert.Equal(diaFunction.noReturn, pdbFunction.IsNoReturn);
                    Assert.Equal(diaFunction.optimizedCodeDebugInfo, pdbFunction.HasOptimizedDebugInfo);
                    Assert.Equal(diaFunction.relativeVirtualAddress, pdbFunction.RelativeVirtualAddress);
                    CompareTypes(diaFunction.type, pdbFunction.FunctionType, checkedTypes);
                    //Assert.Equal(diaFunction.get_undecoratedNameEx(UndecoratedNameOptions.Complete), pdbFunction.GetUndecoratedName(NameUndecorator.Flags.Complete));
                    // TODO: hasAlloca
                    // TODO: hasEH
                    // TODO: hasEHa
                    // TODO: hasInlAsm
                    // TODO: hasLongJump
                    // TODO: hasSecurityChecks
                    // TODO: hasSEH
                    // TODO: hasSetJump
                    // TODO: intro
                    // TODO: InlSpec
                    // TODO: isNaked
                    // TODO: isStatic
                    // TODO: locationType
                    // TODO: noStackOrdering
                    // TODO: pure
                    // TODO: token
                    // TODO: virtual
                    // TODO: virtualBaseOffset
                }

                // Verify publics
                IDiaSymbol[] diaPublicSymbols = diaSession.globalScope.GetChildren(SymTagEnum.PublicSymbol).ToArray();

                Assert.Equal(diaPublicSymbols.Length, pdb.PublicSymbols.Length);
                for (int i = 0; i < diaPublicSymbols.Length; i++)
                {
                    IDiaSymbol      diaPublicSymbol = diaPublicSymbols[i];
                    PdbPublicSymbol pdbPublicSymbol = pdb.PublicSymbols[i];

                    Assert.Equal(diaPublicSymbol.name, pdbPublicSymbol.Name);
                    Assert.Equal(diaPublicSymbol.addressSection, pdbPublicSymbol.Segment);
                    Assert.Equal(diaPublicSymbol.addressOffset, pdbPublicSymbol.Offset);
                    Assert.Equal(diaPublicSymbol.relativeVirtualAddress, pdbPublicSymbol.RelativeVirtualAddress);
                    Assert.Equal(diaPublicSymbol.code, pdbPublicSymbol.IsCode);
                    Assert.Equal(diaPublicSymbol.function, pdbPublicSymbol.IsFunction);
                    Assert.Equal(diaPublicSymbol.managed, pdbPublicSymbol.IsManaged);
                    Assert.Equal(diaPublicSymbol.msil, pdbPublicSymbol.IsMsil);
                    Assert.Equal(LocationType.Static, diaPublicSymbol.locationType);
                    Assert.True(CompareUndecoratedNames(pdbPublicSymbol.Name, diaPublicSymbol.get_undecoratedNameEx(UndecoratedNameOptions.Complete), pdbPublicSymbol.GetUndecoratedName(NameUndecorator.Flags.Complete)));
                    //Assert.Equal(diaPublicSymbol.get_undecoratedNameEx(UndecoratedNameOptions.Complete), pdbPublicSymbol.GetUndecoratedName(NameUndecorator.Flags.Complete));
                    // TODO: diaPublicSymbol.length
                }
            }
        }