Beispiel #1
0
        /// <summary>
        /// Sets private GC object's field EEClass, which is actually describes current class pointer
        /// </summary>
        /// <param name="obj">Object with SyncBlockIndex to be changed</param>
        /// <param name="methodTable">New value of MathodTable pointer</param>
        public static unsafe void SetMethodTable(object obj, MethodTableInfo *methodTable)
        {
            var contents = (EntityInfo *)(EntityPtr.ToPointer(obj));

            contents->MethodTable = methodTable;
        }
Beispiel #2
0
        public static unsafe int SizeOf(object obj)
        {
            var x = SizeOf((EntityInfo *)EntityPtr.ToPointer(obj));

            return(x);
        }
Beispiel #3
0
        /// <summary>
        /// Sets private GC object's field SyncBlockIndex, which is actually index in private GC table.
        /// </summary>
        /// <param name="obj">Object with SyncBlockIndex to be changed</param>
        /// <param name="syncBlockIndex">New value of SyncBlockIndex</param>
        public static unsafe void SetSyncBlockIndex(object obj, int syncBlockIndex)
        {
            var contents = (EntityInfo *)(EntityPtr.ToPointer(obj));

            contents->SyncBlockIndex = syncBlockIndex;
        }
Beispiel #4
0
        /// <summary>
        /// Gets private GC object's fields SyncBlockIndex and EEClass struct pointer
        /// </summary>
        public static unsafe int GetSyncBlockIndex(object obj)
        {
            var contents = (EntityInfo *)EntityPtr.ToPointer(obj);

            return(contents->SyncBlockIndex);
        }
Beispiel #5
0
 public static unsafe EntityInfo *GetEntityInfo(object obj)
 {
     return((EntityInfo *)EntityPtr.ToPointer(obj));
 }
Beispiel #6
0
        private static unsafe void Main()
        {
            var objects = new Dictionary <Type, int>(7000);

            // Get current heap ranges
            IntPtr managedStart, managedEnd;

            Console.ReadKey();
            MemAccessor.GetManagedHeap(out managedStart, out managedEnd);

            // for each byte in virtual memory block, we trying to find strings
            var stopwatch = Stopwatch.StartNew();

            for (IntPtr *ptr = (IntPtr *)managedStart, end = (IntPtr *)managedEnd; ptr < end; ptr++)
            {
                if (IsCorrectMethodsTable(*ptr))
                {
                    // checking next object.
                    int size;
                    try
                    {
                        size = GCEx.SizeOf((EntityInfo *)(ptr - 1)) >> 2;
                    }
                    catch (OverflowException)
                    {
                        continue;
                    }

                    if (ptr + size > (long *)managedEnd)
                    {
                        continue;
                    }

                    {
                        var found = EntityPtr.ToInstance <object>((IntPtr)(ptr - 1));
                        RegisterObject(objects, found);

                        var lastInChain = found;
                        foreach (var item in GCEx.GetObjectsInSOH(found, hmt => IsCorrectMethodsTable((IntPtr)hmt)))
                        {
                            RegisterObject(objects, item.Item);
                            if (!item.IsArrayItem)
                            {
                                lastInChain = item.Item;
                            }
                        }

                        long lastRecognized = (long)EntityPtr.ToPointer(lastInChain);
                        ptr = (IntPtr *)(lastRecognized + lastInChain.SizeOf());
                    }
                }
            }

            var timeToTakeSnapshot = stopwatch.ElapsedMilliseconds;

            foreach (var type in objects.Keys.OrderByDescending(key => objects[key]))
            {
                Console.WriteLine("{0:00000} : {1}", objects[type], type.FullName);
            }

            Console.WriteLine("Objects total: {0}. Time taken: {1}", objects.Values.Sum(), timeToTakeSnapshot);
            Console.ReadKey();
        }
 public A Test_EntityPtr()
 {
     return(EntityPtr.CastRef <A>(instance));
 }