} // end GetImplicitThreadLocalStorageForThread() internal DbgModuleInfo(DbgEngDebugger debugger, DEBUG_MODULE_PARAMETERS nativeParams, DbgTarget target) : base(debugger) { if (null == target) { throw new ArgumentNullException("target"); } Target = target; m_params = nativeParams; if (0 == nativeParams.Base) { throw new ArgumentException("Invalid DEBUG_MODULE_PARAMETERS: no base address.", "nativeParams"); } if (UInt64.MaxValue == nativeParams.Base) // (DEBUG_INVALID_OFFSET) { throw new ArgumentException("Invalid DEBUG_MODULE_PARAMETERS: base address indicates the structure is empty. Guess: Don't pass a base address buffer to GetModuleParameters.", "nativeParams"); } // TODO: more validation? } // end constructor
public DEBUG_MODULE_PARAMETERS GetModuleParameters(uint moduleIndex) { DEBUG_MODULE_PARAMETERS[] moduleParam = new DEBUG_MODULE_PARAMETERS[1]; int res = _symbols.GetModuleParameters(1, null, moduleIndex, moduleParam); if (res != 0) { ThrowDebuggerException(res, "IDebugSymbols.GetModuleParameters"); } return(moduleParam[0]); }
public IList <ModuleInfo> EnumerateModules() { if (_modules != null) { return(_modules); } ulong[] bases = GetImageBases(); if (bases == null || bases.Length == 0) { return(new ModuleInfo[0]); } DEBUG_MODULE_PARAMETERS[] mods = new DEBUG_MODULE_PARAMETERS[bases.Length]; List <ModuleInfo> modules = new List <ModuleInfo>(); HashSet <ulong> encounteredBases = new HashSet <ulong>(); if (bases != null && CanEnumerateModules) { int hr = GetModuleParameters(bases.Length, bases, 0, mods); if (hr >= 0) { for (int i = 0; i < bases.Length; ++i) { ModuleInfo info = new ModuleInfo(this) { TimeStamp = mods[i].TimeDateStamp, FileSize = mods[i].Size, ImageBase = bases[i] }; StringBuilder sbpath = new StringBuilder(); if (GetModuleNameString(DEBUG_MODNAME.IMAGE, i, bases[i], null, 0, out uint needed) >= 0 && needed > 1) { sbpath.EnsureCapacity((int)needed); if (GetModuleNameString(DEBUG_MODNAME.IMAGE, i, bases[i], sbpath, needed, out needed) >= 0) { info.FileName = sbpath.ToString(); } } modules.Add(info); } } } _modules = modules; return(modules); }
public void Execute(CommandExecutionContext context) { if (!String.IsNullOrEmpty(SpecificModule)) { var module = context.Runtime.Modules.FirstOrDefault( m => String.Equals(Path.GetFileName(m.Name), SpecificModule, StringComparison.InvariantCultureIgnoreCase)); if (module != null) { var moduleInfo = context.Runtime.DataTarget.EnumerateModules().Single( m => String.Equals(m.FileName, module.FileName, StringComparison.InvariantCultureIgnoreCase)); context.WriteLine("Module: {0}", module.Name); context.WriteLine("PDB name: {0}", moduleInfo.Pdb.FileName); context.WriteLine("Debug mode: {0}", module.DebuggingMode); } else { // Couldn't find managed module, try to find native: using (var target = context.CreateTemporaryDbgEngTarget()) { var moduleInfo = context.Runtime.DataTarget.EnumerateModules().FirstOrDefault( m => String.Equals(Path.GetFileName(m.FileName), SpecificModule, StringComparison.InvariantCultureIgnoreCase)); if (moduleInfo == null) { return; } IDebugSymbols3 debugSymbols = (IDebugSymbols3)target.DebuggerInterface; uint loaded, unloaded; if (0 != debugSymbols.GetNumberModules(out loaded, out unloaded)) { return; } for (uint moduleIdx = 0; moduleIdx < loaded; ++moduleIdx) { StringBuilder name = new StringBuilder(2048); uint nameSize; if (0 != debugSymbols.GetModuleNameString(DEBUG_MODNAME.IMAGE, moduleIdx, 0, name, (uint)name.Capacity, out nameSize)) { continue; } if (!String.Equals(name.ToString(), moduleInfo.FileName, StringComparison.InvariantCultureIgnoreCase)) { continue; } DEBUG_MODULE_PARAMETERS[] modInfo = new DEBUG_MODULE_PARAMETERS[1]; if (0 != debugSymbols.GetModuleParameters(1, null, moduleIdx, modInfo)) { return; } name = new StringBuilder(2048); debugSymbols.GetModuleNameString(DEBUG_MODNAME.SYMBOL_FILE, moduleIdx, 0, name, (uint)name.Capacity, out nameSize); context.WriteLine("Module: {0}", moduleInfo.FileName); context.WriteLine("PDB loaded: {0}", modInfo[0].SymbolType == DEBUG_SYMTYPE.DIA || modInfo[0].SymbolType == DEBUG_SYMTYPE.PDB); context.WriteLine("PDB name: {0}", name.ToString()); } } } return; } context.WriteLine("{0,-20:x16} {1,-10} {2,-20} {3}", "start", "size", "version", "filename"); foreach (var module in context.Runtime.DataTarget.EnumerateModules()) { context.WriteLine("{0,-20:x16} {1,-10:x} {2,-20} {3}", module.ImageBase, module.FileSize, module.Version, module.FileName); } }
/// <summary> /// Get symbol information for module, see if PDB was loaded or not. /// /// -----> CN: does not work if no CLR is loaded /// </summary> /// <param name="module"></param> public void PrintSymbolState(string module) { if (!string.IsNullOrEmpty(module)) { ClrModule mod = context.Runtime?.Modules.FirstOrDefault( m => string.Equals(Path.GetFileName(m.Name), module, StringComparison.InvariantCultureIgnoreCase)); //ignore case if (mod != null) { ModuleInfo moduleInfo = context.Runtime.DataTarget.EnumerateModules().Single( m => string.Equals(m.FileName, mod.FileName, StringComparison.InvariantCultureIgnoreCase)); context.WriteLine("Module: {0}", mod.Name); context.WriteLine("PDB name: {0}", moduleInfo.Pdb.FileName); context.WriteLine("Debug mode: {0}", mod.DebuggingMode); } else { // try to find native using (DataTarget target = context.CreateTemporaryDbgEngTarget()) { ModuleInfo moduleInfo = context.Runtime.DataTarget.EnumerateModules().FirstOrDefault( m => string.Equals(Path.GetFileName(m.FileName), module, StringComparison.InvariantCultureIgnoreCase)); if (moduleInfo == null) { return; } var debugSymbols = (IDebugSymbols3)target.DebuggerInterface; uint loaded, unloaded; if (0 != debugSymbols.GetNumberModules(out loaded, out unloaded)) { return; } for (uint moduleIdx = 0; moduleIdx < loaded; ++moduleIdx) { var name = new StringBuilder(2048); uint nameSize; if (0 != debugSymbols.GetModuleNameString(DEBUG_MODNAME.IMAGE, moduleIdx, 0, name, (uint)name.Capacity, out nameSize)) { continue; } if (!string.Equals(name.ToString(), moduleInfo.FileName, StringComparison.InvariantCultureIgnoreCase)) { continue; } var modInfo = new DEBUG_MODULE_PARAMETERS[1]; if (0 != debugSymbols.GetModuleParameters(1, null, moduleIdx, modInfo)) { return; } name = new StringBuilder(2048); debugSymbols.GetModuleNameString(DEBUG_MODNAME.SYMBOL_FILE, moduleIdx, 0, name, (uint)name.Capacity, out nameSize); context.WriteLine("Module: {0}", moduleInfo.FileName); context.WriteLine("PDB loaded: {0}", modInfo[0].SymbolType == DEBUG_SYMTYPE.DIA || modInfo[0].SymbolType == DEBUG_SYMTYPE.PDB); context.WriteLine("PDB name: {0}", name.ToString()); } } } } else { context.WriteLine("No module specified."); } }
private unsafe ModuleData ToModuleData(byte[] moduleInfoBuffer, ModuleVersionInfo versionInfo, DEBUG_MODULE_PARAMETERS moduleParams) { fixed(byte *buf = moduleInfoBuffer) { IMAGEHLP_MODULEW64 mi = Marshal.PtrToStructure <IMAGEHLP_MODULEW64>(new IntPtr(buf)); return(new ModuleData(mi.ModuleName, mi.ImageName, mi.LoadedImageName, mi.LoadedPdbName, mi.BaseOfImage, mi.ImageSize, moduleParams.TimeDateStamp, moduleParams.Checksum, mi.NumSyms, (uint)mi.SymType, mi.PdbSig70, mi.PdbAge, mi.PdbUnmatched, mi.LineNumbers, mi.GlobalSymbols, mi.TypeInfo, mi.SourceIndexed, mi.Publics, mi.MachineType, versionInfo)); } }