示例#1
0
        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);
        }
示例#3
0
        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());
        }
示例#4
0
        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());
        }
示例#5
0
 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));
        }
示例#7
0
        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));
            }
        }
示例#8
0
        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());
        }