void HandleNewHeapshot(KrofilerSession session, Heapshot hs) { //hs.BuildReferencesFrom(); //Console.WriteLine("Hs:" + hs.Name); //Console.WriteLine("Objects Count:" + hs.ObjectsInfoMap.Count); //int count = 0; //foreach (var obj in hs.ObjectsInfoMap.Values) { // if (obj.ReferencesFrom.Count == 0 && !hs.Roots.ContainsKey(obj.ObjAddr)) { // count++; // Console.WriteLine($"{obj.ObjAddr} type:{session.GetTypeName(obj.TypeId)}"); // foreach (var b in obj.Allocation.Backtrace) { // Console.WriteLine(" " + session.GetMethodName(b)); // } // } //} //Console.WriteLine("Orphans count:" + count); Application.Instance.AsyncInvoke(delegate { listViewLeft.Items.Add(new ListItem() { Text = hs.Name, Tag = hs }); listViewRight.Items.Add(new ListItem() { Text = hs.Name, Tag = hs }); }); }
public RetentionGraph(KrofilerSession session, Heapshot heapshot) { this.heapshot = heapshot; this.session = session; Width = 1000; Height = 2000; }
public ObjectListTab(KrofilerSession session, Heapshot heapshot, Dictionary <long, List <ObjectInfo> > typesToObjectsListMap) { this.typesToObjectsListMap = typesToObjectsListMap; this.session = session; this.heapshot = heapshot; this.Orientation = Orientation.Horizontal; CreateTypesView(); filterTypesTextBox = new TextBox(); filterTypesTextBox.TextChanged += FilterTypesTextBox_TextChanged; this.SplitterWidth = 10; var filterAndTypesStackLayout = new StackLayout(); filterAndTypesStackLayout.Items.Add(new StackLayoutItem(filterTypesTextBox, HorizontalAlignment.Stretch)); filterAndTypesStackLayout.Items.Add(new StackLayoutItem(typesGrid, HorizontalAlignment.Stretch, true)); this.Panel1 = filterAndTypesStackLayout; CreateObjectsView(); var splitter2 = new Splitter() { Orientation = Orientation.Horizontal }; splitter2.SplitterWidth = 5; splitter2.Panel1 = objectsGrid; objectPanel = new ObjectDetailsPanel(session, this.heapshot); objectPanel.InsertTab += (a, b) => InsertTab?.Invoke(a, b ?? this); splitter2.Panel2 = objectPanel; Panel2 = splitter2; this.Position = (int)Screen.PrimaryScreen.Bounds.Width / 3; }
public CompareHeapshotsTab(KrofilerSession session, Heapshot hs1, Heapshot hs2) { this.session = session; if (hs2.Id > hs1.Id) { newHeapshot = hs2; oldHeapshot = hs1; } else { newHeapshot = hs1; oldHeapshot = hs2; } var diff = new DiffHeap(oldHeapshot, newHeapshot); var newObjects = diff.NewObjects.GroupBy(addr => addr.TypeId).ToDictionary(d => d.Key, d => d.ToList()); var deleted = diff.DeletedObjects.GroupBy(addr => addr.TypeId).ToDictionary(d => d.Key, d => d.ToList()); var allObjectsInOldHs = oldHeapshot.TypesToObjectsListMap; var allObjectsInNewHs = newHeapshot.TypesToObjectsListMap; var hashTableAllTypes = new HashSet <long>(); foreach (var t in allObjectsInOldHs) { hashTableAllTypes.Add(t.Key); } foreach (var t in allObjectsInNewHs) { hashTableAllTypes.Add(t.Key); } foreach (var typeId in hashTableAllTypes) { typesCollection.Add(new TypeChangeInfo { TypeId = typeId, TypeName = session.GetTypeName(typeId), NewObjects = newObjects.ContainsKey(typeId) ? newObjects[typeId] : EmptyList, DeadObjects = deleted.ContainsKey(typeId) ? deleted[typeId] : EmptyList, OldHsObjects = allObjectsInOldHs.ContainsKey(typeId) ? allObjectsInOldHs[typeId] : EmptyList, NewHsObjects = allObjectsInNewHs.ContainsKey(typeId) ? allObjectsInNewHs[typeId] : EmptyList }); } filterTypesTextBox = new TextBox(); filterTypesTextBox.TextChanged += FilterTypesTextBox_TextChanged; CreateTypesView(); var filterAndTypesStackLayout = new StackLayout(); filterAndTypesStackLayout.Items.Add(new StackLayoutItem(filterTypesTextBox, HorizontalAlignment.Stretch)); filterAndTypesStackLayout.Items.Add(new StackLayoutItem(typesGrid, HorizontalAlignment.Stretch, true)); Content = filterAndTypesStackLayout; }
public DiffHeap(Heapshot oldHs, Heapshot newHs) { OldHeapshot = oldHs; NewHeapshot = newHs; var oldAllocs = oldHs.ObjectsInfoMap.ToDictionary(p => p.Value.Allocation, p => p.Value); var newAllocs = newHs.ObjectsInfoMap.ToDictionary(p => p.Value.Allocation, p => p.Value); foreach (var a in oldAllocs) { if (!newAllocs.Remove(a.Key)) { DeletedObjects.Add(a.Value); } } // What is left in list is new NewObjects.AddRange(newAllocs.Values); }
public override void Visit(HeapEndEvent ev) { processingHeapTime.Stop(); var deadAllocations = new HashSet <long>(); foreach (var key in allocationsTracker.Keys) { if (!currentHeapshot.ObjectsInfoMap.ContainsKey(key)) { deadAllocations.Add(key); } } foreach (var key in deadAllocations) { allocationsTracker.Remove(key); } session.NewHeapshot?.Invoke(session, currentHeapshot); currentHeapshot = null; }
void HandleNewHeapshot(KrofilerSession session, Heapshot hs) { Application.Instance.Invoke(delegate { var hsButton = new Button { Text = hs.Name }; listViewLeft.Items.Add(new ListItem() { Text = hs.Name, Tag = hs }); listViewRight.Items.Add(new ListItem() { Text = hs.Name, Tag = hs }); hsButton.Click += delegate { InsertTab(new ObjectListTab(session, hs, hs.TypesToObjectsListMap), this); }; commandButtonsStack.Items.Add(hsButton); }); }
public override void Visit(HeapBeginEvent ev) { currentHeapshot = new Heapshot(session, ++heapshotCounter); }
public override void Visit(HeapBeginEvent ev) { processingHeapTime = Stopwatch.StartNew(); currentHeapshot = new Heapshot(session, ++heapshotCounter); }