void IDkmClrExpressionCompilerCallback.CompileDisplayAttribute(
     DkmLanguageExpression expression,
     DkmClrModuleInstance moduleInstance,
     int token,
     out string error,
     out DkmCompiledClrInspectionQuery result)
 {
     try
     {
         var runtimeInstance = moduleInstance.RuntimeInstance;
         var appDomain       = moduleInstance.AppDomain;
         var compileResult   = this.CompileWithRetry(
             moduleInstance,
             runtimeInstance.GetMetadataBlocks(appDomain),
             (blocks, useReferencedModulesOnly) => CreateTypeContext(appDomain, blocks, moduleInstance.Mvid, token, useReferencedModulesOnly),
             (context, diagnostics) =>
         {
             ResultProperties unusedResultProperties;
             return(context.CompileExpression(
                        RuntimeInspectionContext.Empty,
                        expression.Text,
                        DkmEvaluationFlags.TreatAsExpression,
                        diagnostics,
                        out unusedResultProperties,
                        testData: null));
         },
             out error);
         result = compileResult.ToQueryResult(this.CompilerId, default(ResultProperties), runtimeInstance);
     }
     catch (Exception e) when(ExpressionEvaluatorFatalError.CrashIfFailFastEnabled(e))
     {
         throw ExceptionUtilities.Unreachable;
     }
 }
        internal static bool TryGetModuleInfo(this DkmClrModuleInstance module, [NotNullWhen(true)] out EnC.DebuggeeModuleInfo?info)
        {
            Debug.Assert(Thread.CurrentThread.GetApartmentState() == ApartmentState.MTA, "SymReader requires MTA");

            IntPtr metadataPtr;
            uint   metadataSize;

            try
            {
                metadataPtr = module.GetBaselineMetaDataBytesPtr(out metadataSize);
            }
            catch (Exception e) when(DkmExceptionUtilities.IsBadOrMissingMetadataException(e))
            {
                info = null;
                return(false);
            }

            var symReader = module.GetSymUnmanagedReader() as ISymUnmanagedReader5;

            if (symReader == null)
            {
                info = null;
                return(false);
            }

            var metadata = ModuleMetadata.CreateFromMetadata(metadataPtr, (int)metadataSize);

            info = new EnC.DebuggeeModuleInfo(metadata, symReader);
            return(true);
        }
Example #3
0
        /// <summary>
        /// Attempt to construct a <see cref="MetadataReader"/> instance for this module.
        /// </summary>
        /// <returns>Returns 'false' for modules with "bad" or missing metadata.</returns>
        private static bool TryGetMetadataReader(this DkmClrModuleInstance module, out MetadataReader reader)
        {
            int    size;
            IntPtr ptr;

            return(module.TryGetMetadataReader(out ptr, out size, out reader));
        }
        internal override CSharpCompilation GetCompilation(DkmClrModuleInstance moduleInstance)
        {
            var appDomain       = moduleInstance.AppDomain;
            var moduleVersionId = moduleInstance.Mvid;
            var previous        = appDomain.GetMetadataContext <CSharpMetadataContext>();
            var metadataBlocks  = moduleInstance.RuntimeInstance.GetMetadataBlocks(appDomain, previous.MetadataBlocks);

            var kind             = GetMakeAssemblyReferencesKind();
            var contextId        = MetadataContextId.GetContextId(moduleVersionId, kind);
            var assemblyContexts = previous.Matches(metadataBlocks) ? previous.AssemblyContexts : ImmutableDictionary <MetadataContextId, CSharpMetadataContext> .Empty;
            CSharpMetadataContext previousContext;

            assemblyContexts.TryGetValue(contextId, out previousContext);

            var compilation = previousContext.Compilation;

            if (compilation == null)
            {
                compilation = metadataBlocks.ToCompilation(moduleVersionId, kind);
                appDomain.SetMetadataContext(
                    new MetadataContext <CSharpMetadataContext>(
                        metadataBlocks,
                        assemblyContexts.SetItem(contextId, new CSharpMetadataContext(compilation))),
                    report: kind == MakeAssemblyReferencesKind.AllReferences);
            }

            return(compilation);
        }
Example #5
0
 private EvaluationContextBase CreateTypeContext(DkmClrModuleInstance moduleInstance, ImmutableArray <MetadataBlock> references, int typeToken)
 {
     return(this.CreateTypeContext(
                moduleInstance.AppDomain,
                references,
                moduleInstance.Mvid,
                typeToken));
 }
Example #6
0
        internal static object?GetSymReader(this DkmClrModuleInstance clrModule)
        {
            var module = clrModule.Module; // Null if there are no symbols.

            if (module == null)
            {
                return(null);
            }
            // Use DkmClrModuleInstance.GetSymUnmanagedReader()
            // rather than DkmModule.GetSymbolInterface() since the
            // latter does not handle .NET Native modules.
            return(clrModule.GetSymUnmanagedReader());
        }
 private TResult CompileWithRetry <TResult>(
     DkmClrModuleInstance moduleInstance,
     ImmutableArray <MetadataBlock> metadataBlocks,
     CreateContextDelegate createContext,
     CompileDelegate <TResult> compile,
     out string errorMessage)
 {
     return(CompileWithRetry(
                metadataBlocks,
                this.DiagnosticFormatter,
                createContext,
                compile,
                (AssemblyIdentity assemblyIdentity, out uint size) => moduleInstance.AppDomain.GetMetaDataBytesPtr(assemblyIdentity.GetDisplayName(), out size),
                out errorMessage));
 }
        private static ModuleMetadata GetBaselineModuleMetadata(DkmClrModuleInstance module)
        {
            IntPtr metadataPtr;
            uint   metadataSize;

            try
            {
                metadataPtr = module.GetBaselineMetaDataBytesPtr(out metadataSize);
            }
            catch (Exception e) when(DkmExceptionUtilities.IsBadOrMissingMetadataException(e))
            {
                return(null);
            }

            return(ModuleMetadata.CreateFromMetadata(metadataPtr, (int)metadataSize));
        }
        private ImportedModule ImportModule(DkmClrModuleInstance debuggerModule)
        {
            IntPtr metadataBlock;
            uint   blockSize;

            try
            {
                metadataBlock = debuggerModule.GetMetaDataBytesPtr(out blockSize);
                return(Session.Importer.ImportModule(metadataBlock, blockSize));
            }
            catch (DkmException)
            {
                // This can fail when dump debugging if the full heap is not available
                return(null);
            }
        }
Example #10
0
        public DkmClrValue InstantiateDynamicViewProxy(DkmInspectionContext inspectionContext)
        {
            if (inspectionContext == null)
            {
                throw new ArgumentNullException(nameof(inspectionContext));
            }

            var module = new DkmClrModuleInstance(
                this.Type.AppDomain.RuntimeInstance,
                typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly,
                new DkmModule("Microsoft.CSharp.dll"));
            var proxyType = module.ResolveTypeName(
                "Microsoft.CSharp.RuntimeBinder.DynamicMetaObjectProviderDebugView",
                s_noArguments);

            return(this.InstantiateProxyType(inspectionContext, proxyType));
        }
Example #11
0
 /// <summary>
 /// Attempt to construct a <see cref="MetadataReader"/> instance for this module.
 /// </summary>
 /// <returns>Returns 'false' for modules with "bad" or missing metadata.</returns>
 private unsafe static bool TryGetMetadataReader(this DkmClrModuleInstance module, out IntPtr ptr, out int size, out MetadataReader reader)
 {
     try
     {
         uint uSize;
         ptr    = module.GetMetaDataBytesPtr(out uSize);
         size   = (int)uSize;
         reader = new MetadataReader((byte *)ptr, size);
         return(true);
     }
     catch (Exception e) when(MetadataUtilities.IsBadOrMissingMetadataException(e, module.FullName))
     {
         ptr    = IntPtr.Zero;
         size   = 0;
         reader = null;
         return(false);
     }
 }
Example #12
0
        internal override CSharpCompilation GetCompilation(DkmClrModuleInstance moduleInstance)
        {
            var appDomain      = moduleInstance.AppDomain;
            var previous       = appDomain.GetMetadataContext <CSharpMetadataContext>();
            var metadataBlocks = moduleInstance.RuntimeInstance.GetMetadataBlocks(appDomain);

            CSharpCompilation compilation;

            if (previous.Matches(metadataBlocks))
            {
                compilation = previous.Compilation;
            }
            else
            {
                compilation = metadataBlocks.ToCompilation();
                appDomain.SetMetadataContext(new CSharpMetadataContext(metadataBlocks, compilation));
            }

            return(compilation);
        }
Example #13
0
        internal override CSharpCompilation GetCompilation(DkmClrModuleInstance moduleInstance)
        {
            var appDomain      = moduleInstance.AppDomain;
            var previous       = appDomain.GetDataItem <CSharpMetadataContext>();
            var metadataBlocks = moduleInstance.RuntimeInstance.GetMetadataBlocks(appDomain);

            CSharpCompilation compilation;

            if (metadataBlocks.HaveNotChanged(previous))
            {
                compilation = previous.Compilation;
            }
            else
            {
                var dataItem = new CSharpMetadataContext(metadataBlocks);
                appDomain.SetDataItem(DkmDataCreationDisposition.CreateAlways, dataItem);
                compilation = dataItem.Compilation;
            }

            return(compilation);
        }
Example #14
0
        void IDkmClrExpressionCompilerCallback.CompileDisplayAttribute(
            DkmLanguageExpression expression,
            DkmClrModuleInstance moduleInstance,
            int token,
            out string error,
            out DkmCompiledClrInspectionQuery result)
        {
            try
            {
                var appDomain  = moduleInstance.AppDomain;
                var references = moduleInstance.Process.GetMetadataBlocks(appDomain);

                ResultProperties unusedResultProperties;
                ImmutableArray <AssemblyIdentity> missingAssemblyIdentities;
                CompileResult compileResult;
                do
                {
                    var context = this.CreateTypeContext(moduleInstance, references, token);
                    compileResult = context.CompileExpression(
                        RuntimeInspectionContext.Empty,
                        expression.Text,
                        DkmEvaluationFlags.TreatAsExpression,
                        this.DiagnosticFormatter,
                        out unusedResultProperties,
                        out error,
                        out missingAssemblyIdentities,
                        preferredUICulture: null,
                        testData: null);
                } while (ShouldTryAgainWithMoreMetadataBlocks(appDomain, missingAssemblyIdentities, ref references));

                result = compileResult.ToQueryResult(this.CompilerId, default(ResultProperties), moduleInstance.RuntimeInstance);
            }
            catch (Exception e) when(ExpressionEvaluatorFatalError.CrashIfFailFastEnabled(e))
            {
                throw ExceptionUtilities.Unreachable;
            }
        }
Example #15
0
 internal abstract TCompilation GetCompilation(DkmClrModuleInstance moduleInstance);
Example #16
0
        string IDkmClrFullNameProvider2.GetClrNameForField(DkmInspectionContext inspectionContext, DkmClrModuleInstance moduleInstance, int fieldToken)
        {
            var import = (IMetadataImport)moduleInstance.GetMetaDataImport();

            // Just get some of information about properties. Get rest later only if needed.
            int       hr   = import.GetFieldProps(fieldToken, out _, null, 0, out var nameLength, out _, out _, out _, out _, out _, out _);
            const int S_OK = 0;

            if (hr != S_OK)
            {
                throw new ArgumentException("Invalid field token.", nameof(fieldToken));
            }

            var sb = new StringBuilder(nameLength);

            hr = import.GetFieldProps(fieldToken, out _, sb, sb.Capacity, out _, out _, out _, out _, out _, out _, out _);
            if (hr != S_OK)
            {
                throw new DkmException((DkmExceptionCode)hr);
            }

            string metadataName = sb.ToString();

            return(GetOriginalFieldName(metadataName));
        }
Example #17
0
 string IDkmClrFullNameProvider2.GetClrNameForLocalVariable(DkmInspectionContext inspectionContext, DkmClrModuleInstance moduleInstance, DkmClrMethodId methodId, DkmILRange iLRange, DkmClrLocalVariable localVariable)
 {
     return(GetOriginalLocalVariableName(localVariable.Name));
 }
Example #18
0
        internal static object GetSymReader(this DkmClrModuleInstance clrModule)
        {
            var module = clrModule.Module; // Null if there are no symbols.

            return((module == null) ? null : module.GetSymbolInterface(s_symUnmanagedReaderClassId));
        }
 internal void OnManagedModuleInstanceUnloaded(DkmClrModuleInstance moduleInstance)
 => _encService.OnManagedModuleInstanceUnloaded(moduleInstance.Mvid);