Exemple #1
0
        public void AddObject(TypeInfo typeInfo, HeapObjectEvent heapObjectEvent)
        {
            if (heapObjectEvent.ObjectSize == 0)
            {
                // This means it's just reporting references
                // TODO: Validate if we need to handle it.
                return;
            }

            string typeName = typeInfo.Name;
            long   typeId   = typeInfo.TypeId;
            long   address  = heapObjectEvent.ObjectPointer;

            if (trackedTypeNames.Remove(typeName))
            {
                TrackedTypes.Add(typeName, typeId);
            }

            if (!Types.TryGetValue(typeId, out var heapTypeInfo))
            {
                Types[typeId] = heapTypeInfo = new HeapshotTypeInfo(typeInfo);
            }

            var heapObject = GetOrCreateObject(address, heapTypeInfo);

            Graph.AddVertex(heapObject);
            foreach (var reference in heapObjectEvent.References)
            {
                var referencedObject = GetOrCreateObject(reference.ObjectPointer, null);
                Graph.AddEdge(new Edge <HeapObject> (heapObject, referencedObject));
            }
        }
            public override void Visit(HeapObjectEvent ev)
            {
                var classInfoId = vtableToClassInfo[ev.VTablePointer];
                var typeInfo    = typeInfos[classInfoId];

                currentHeapshot.AddObject(typeInfo, ev);
            }
Exemple #3
0
            public override void Visit(HeapObjectEvent ev)
            {
                if (ev.ObjectSize == 0)
                {
                    var existingObj = currentHeapshot.ObjectsInfoMap[ev.ObjectPointer];
                    //Todo: optimise to not use linq?
                    existingObj.ReferencesTo = existingObj.ReferencesTo.Concat(ev.References.Select(r => r.ObjectPointer)).ToArray();
                    existingObj.ReferencesAt = existingObj.ReferencesAt.Concat(ev.References.Select(r => (ushort)r.Offset)).ToArray();
                    return;
                }

                var obj = new ObjectInfo();

                obj.Allocation   = allocationsTracker[ev.ObjectPointer];
                obj.ObjAddr      = ev.ObjectPointer;
                obj.TypeId       = ev.ClassPointer;
                obj.ReferencesTo = ev.References.Select(r => r.ObjectPointer).ToArray();
                obj.ReferencesAt = ev.References.Select(r => (ushort)r.Offset).ToArray();
                if (!currentHeapshot.TypesToObjectsListMap.ContainsKey(ev.ClassPointer))
                {
                    currentHeapshot.TypesToObjectsListMap[ev.ClassPointer] = new List <ObjectInfo>();
                }
                currentHeapshot.TypesToObjectsListMap[ev.ClassPointer].Add(obj);

                currentHeapshot.ObjectsInfoMap.Add(ev.ObjectPointer, obj);
            }
            public override void Visit(HeapObjectEvent ev)
            {
                if (ev.ObjectSize == 0)
                {
                    var existingObj = currentHeapshot.ObjectsInfoMap[ev.ObjectPointer];
                    Array.Resize(ref existingObj.ReferencesTo, existingObj.ReferencesTo.Length + ev.ReferencesTo.Length);
                    Array.Copy(ev.ReferencesTo, 0, existingObj.ReferencesTo, existingObj.ReferencesTo.Length - ev.ReferencesTo.Length, ev.ReferencesTo.Length);
                    Array.Resize(ref existingObj.ReferencesAt, existingObj.ReferencesAt.Length + ev.ReferencesAt.Length);
                    Array.Copy(ev.ReferencesAt, 0, existingObj.ReferencesAt, existingObj.ReferencesAt.Length - ev.ReferencesAt.Length, ev.ReferencesAt.Length);
                    return;
                }

                var obj = new ObjectInfo();

                try {
                    obj.Allocation = allocationsTracker[ev.ObjectPointer];
                } catch {
                    obj.Allocation = new AllocationEvent();
                    Console.WriteLine("OMG:" + session.classIdToName[vtableToClass[ev.VTablePointer]]);
                }
                obj.ObjAddr      = ev.ObjectPointer;
                obj.TypeId       = vtableToClass[ev.VTablePointer];
                obj.ReferencesTo = ev.ReferencesTo;
                obj.ReferencesAt = ev.ReferencesAt;
                if (!currentHeapshot.TypesToObjectsListMap.ContainsKey(obj.TypeId))
                {
                    currentHeapshot.TypesToObjectsListMap[obj.TypeId] = new List <ObjectInfo>();
                }
                currentHeapshot.TypesToObjectsListMap[obj.TypeId].Add(obj);

                currentHeapshot.ObjectsInfoMap.Add(ev.ObjectPointer, obj);
            }
            public override void Visit(HeapObjectEvent ev)
            {
                if (ev.ObjectSize == 0)                //This means it's just reporting references
                {
                    return;
                }
                var classInfoId = vtableToClassInfo[ev.VTablePointer];

                if (currentHeapshot.ObjectsPerClassCounter.ContainsKey(classInfoId))
                {
                    currentHeapshot.ObjectsPerClassCounter[classInfoId]++;
                }
                else
                {
                    currentHeapshot.ObjectsPerClassCounter[classInfoId] = 0;
                }
            }
Exemple #6
0
            public override void Visit(HeapObjectEvent ev)
            {
                var classInfoId = vtableToClassInfo[ev.VTablePointer];
                var typeInfo    = typeInfos[classInfoId];

                if (ev.ObjectSize == 0)
                {
                    // This means it's just reporting references
                    // TODO: Validate if we need to handle it.
                    return;
                }

                var obj = heapBuilder.AddObject(typeInfo, ev.ObjectPointer);

                for (int i = 0; i < ev.References.Count; ++i)
                {
                    var reference = ev.References[i];
                    // Mono does not support getting the field name.
                    heapBuilder.AddReference(obj, reference.ObjectPointer, viaField: null);
                }
            }
Exemple #7
0
 public virtual void Visit(HeapObjectEvent ev)
 {
 }