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); }
/// <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); }
private EvaluationContextBase CreateTypeContext(DkmClrModuleInstance moduleInstance, ImmutableArray <MetadataBlock> references, int typeToken) { return(this.CreateTypeContext( moduleInstance.AppDomain, references, moduleInstance.Mvid, typeToken)); }
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); } }
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)); }
/// <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); } }
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); }
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); }
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; } }
internal abstract TCompilation GetCompilation(DkmClrModuleInstance moduleInstance);
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)); }
string IDkmClrFullNameProvider2.GetClrNameForLocalVariable(DkmInspectionContext inspectionContext, DkmClrModuleInstance moduleInstance, DkmClrMethodId methodId, DkmILRange iLRange, DkmClrLocalVariable localVariable) { return(GetOriginalLocalVariableName(localVariable.Name)); }
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);