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); }
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; } }
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); } }
public virtual void Visit(HeapObjectEvent ev) { }