Exemplo n.º 1
0
        } // 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
Exemplo n.º 2
0
        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]);
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
0
Arquivo: LM.cs Projeto: tiandian/msos
        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);
            }
        }
Exemplo n.º 5
0
        /// <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.");
            }
        }
Exemplo n.º 6
0
        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));
            }
        }