internal static ImmutableArray <MetadataBlock> GetMetadataBlocks(GetMetadataBytesPtrFunction getMetaDataBytesPtrFunction, ImmutableArray <AssemblyIdentity> missingAssemblyIdentities) { ArrayBuilder <MetadataBlock>?builder = null; foreach (var missingAssemblyIdentity in missingAssemblyIdentities) { MetadataBlock block; try { uint size; IntPtr ptr; ptr = getMetaDataBytesPtrFunction(missingAssemblyIdentity, out size); Debug.Assert(size > 0); block = GetMetadataBlock(ptr, size); } catch (Exception e) when(DkmExceptionUtilities.IsBadOrMissingMetadataException(e)) { continue; } if (builder == null) { builder = ArrayBuilder <MetadataBlock> .GetInstance(); } builder.Add(block); } return(builder == null ? ImmutableArray <MetadataBlock> .Empty : builder.ToImmutableAndFree()); }
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); }
internal static ImmutableArray <AssemblyReaders> MakeAssemblyReaders(this DkmClrInstructionAddress instructionAddress) { var builder = ArrayBuilder <AssemblyReaders> .GetInstance(); foreach (DkmClrModuleInstance module in instructionAddress.RuntimeInstance.GetModulesInAppDomain(instructionAddress.ModuleInstance.AppDomain)) { var symReader = module.GetSymReader(); if (symReader == null) { continue; } MetadataReader reader; unsafe { try { uint size; IntPtr ptr; ptr = module.GetMetaDataBytesPtr(out size); Debug.Assert(size > 0); reader = new MetadataReader((byte *)ptr, (int)size); } catch (Exception e) when(DkmExceptionUtilities.IsBadOrMissingMetadataException(e)) { continue; } } builder.Add(new AssemblyReaders(reader, symReader)); } return(builder.ToImmutableAndFree()); }
internal static ImmutableArray <MetadataBlock> GetMetadataBlocks( this DkmClrRuntimeInstance runtime, DkmClrAppDomain appDomain, ImmutableArray <MetadataBlock> previousMetadataBlocks) { // Add a dummy data item to the appdomain to add it to the disposal queue when the debugged process is shutting down. // This should prevent from attempts to use the Metadata pointer for dead debugged processes. if (appDomain.GetDataItem <AppDomainLifetimeDataItem>() == null) { appDomain.SetDataItem(DkmDataCreationDisposition.CreateNew, new AppDomainLifetimeDataItem()); } var builder = ArrayBuilder <MetadataBlock> .GetInstance(); IntPtr ptr; uint size; int index = 0; foreach (DkmClrModuleInstance module in runtime.GetModulesInAppDomain(appDomain)) { try { ptr = module.GetMetaDataBytesPtr(out size); Debug.Assert(size > 0); } catch (NotImplementedException e) when(module is DkmClrNcModuleInstance) { // DkmClrNcModuleInstance.GetMetaDataBytesPtr not implemented in Dev14. throw new NotImplementedMetadataException(e); } catch (Exception e) when(DkmExceptionUtilities.IsBadOrMissingMetadataException(e)) { continue; } if (!TryGetMetadataBlock(previousMetadataBlocks, index, ptr, size, out var block)) { // ignore modules with bad metadata headers continue; } Debug.Assert(block.ModuleVersionId == module.Mvid); builder.Add(block); index++; } // Include "intrinsic method" assembly. ptr = runtime.GetIntrinsicAssemblyMetaDataBytesPtr(out size); if (!TryGetMetadataBlock(previousMetadataBlocks, index, ptr, size, out var intrinsicsBlock)) { throw ExceptionUtilities.Unreachable; } builder.Add(intrinsicsBlock); return(builder.ToImmutableAndFree()); }
internal sealed override unsafe bool TryGetMetadata(DkmClrModuleInstance module, out byte *pointer, out int length) { try { pointer = (byte *)module.GetMetaDataBytesPtr(out var size); length = (int)size; return(true); } catch (Exception e) when(DkmExceptionUtilities.IsBadOrMissingMetadataException(e)) { pointer = null; length = 0; return(false); } }
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)); }
internal sealed override MetadataReader GetModuleMetadata(DkmClrModuleInstance module) { uint length; IntPtr ptr; try { ptr = module.GetMetaDataBytesPtr(out length); } catch (Exception e) when(DkmExceptionUtilities.IsBadOrMissingMetadataException(e)) { return(null); } Debug.Assert(length > 0); unsafe { return(new MetadataReader((byte *)ptr, (int)length)); } }
internal static ImmutableArray <MetadataBlock> GetMetadataBlocks( this DkmClrRuntimeInstance runtime, DkmClrAppDomain appDomain, ImmutableArray <MetadataBlock> previousMetadataBlocks) { var builder = ArrayBuilder <MetadataBlock> .GetInstance(); IntPtr ptr; uint size; int index = 0; foreach (DkmClrModuleInstance module in runtime.GetModulesInAppDomain(appDomain)) { MetadataBlock block; try { ptr = module.GetMetaDataBytesPtr(out size); Debug.Assert(size > 0); block = GetMetadataBlock(previousMetadataBlocks, index, ptr, size); } catch (NotImplementedException e) when(module is DkmClrNcModuleInstance) { // DkmClrNcModuleInstance.GetMetaDataBytesPtr not implemented in Dev14. throw new NotImplementedMetadataException(e); } catch (Exception e) when(DkmExceptionUtilities.IsBadOrMissingMetadataException(e)) { continue; } Debug.Assert(block.ModuleVersionId == module.Mvid); builder.Add(block); index++; } // Include "intrinsic method" assembly. ptr = runtime.GetIntrinsicAssemblyMetaDataBytesPtr(out size); builder.Add(GetMetadataBlock(previousMetadataBlocks, index, ptr, size)); return(builder.ToImmutableAndFree()); }