/// <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); }
/// <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)); }
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); } }
public PDBEntry(string pdbPath) { source = DiaLoader.CreateDiaSource(); source.loadDataFromPdb(pdbPath); source.openSession(out session); }
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 } } }