示例#1
0
        private IEnumerable <ClrHandle> EnumerateHandleWorker()
        {
            Debug.Assert(_handles == null);
            List <ClrHandle> result = new List <ClrHandle>();

            using (SOSHandleEnum handleEnum = _sos.EnumerateHandles())
            {
                HandleData[] handles = new HandleData[8];
                int          fetched = 0;

                while ((fetched = handleEnum.ReadHandles(handles)) != 0)
                {
                    for (int i = 0; i < fetched; i++)
                    {
                        ClrHandle handle = new ClrHandle(this, Heap, handles[i]);
                        result.Add(handle);
                        yield return(handle);

                        handle = handle.GetInteriorHandle();
                        if (handle != null)
                        {
                            result.Add(handle);
                            yield return(handle);
                        }
                    }
                }
            }

            _handles = result;
        }
示例#2
0
        internal override Dictionary <ulong, List <ulong> > GetDependentHandleMap(CancellationToken cancelToken)
        {
            Dictionary <ulong, List <ulong> > result = new Dictionary <ulong, List <ulong> >();

            using (SOSHandleEnum handleEnum = _sos.EnumerateHandles())
            {
                if (handleEnum == null)
                {
                    return(result);
                }

                HandleData[] handles = new HandleData[32];

                int fetched;
                while ((fetched = handleEnum.ReadHandles(handles)) != 0)
                {
                    for (int i = 0; i < fetched; i++)
                    {
                        cancelToken.ThrowIfCancellationRequested();

                        HandleType type = (HandleType)handles[i].Type;
                        if (type != HandleType.Dependent)
                        {
                            continue;
                        }

                        if (ReadPointer(handles[i].Handle, out ulong address))
                        {
                            if (!result.TryGetValue(address, out List <ulong> value))
                            {
                                result[address] = value = new List <ulong>();
                            }

                            value.Add(handles[i].Secondary);
                        }
                    }
                }

                return(result);
            }
        }