void listBox_Leaks_SelectedIndexChanged(object sender, EventArgs e) { Leak leak = listBox_Leaks.SelectedItem as Leak; if (leak != null) { textBox_CallStack.Text = leak.CallStack; } }
private async void button_ParseHeapLeak_Click(object sender, EventArgs e) { string logPath = textBox_WindbgLogPath.Text; if (!File.Exists(logPath)) { MessageBox.Show("Please specify the windbg log file!", "Error!"); return; } m_Leaks.Clear(); listBox_Leaks.Items.Clear(); m_Leaks = await Task <List <Leak> > .Factory.StartNew(() => { List <Leak> leaks = new List <Leak>(); Leak currentLeak = null; using (StreamReader sr = new StreamReader(logPath)) { while (!sr.EndOfStream) { string line = sr.ReadLine(); Match leakMatch = s_LeakHeader.Match(line); if (leakMatch.Success) { if (currentLeak != null) { addNewLeak(leaks, currentLeak); } currentLeak = new Leak(leakMatch.Groups[1].ToString(), leakMatch.Groups[2].ToString()); continue; } Match stackMatch = s_CallStack.Match(line); if (stackMatch.Success && currentLeak != null) { currentLeak.AppendCallStack(stackMatch.Groups[1].ToString()); } } } addNewLeak(leaks, currentLeak); return(leaks); }); textBox_Total.Text = m_Total.ToString("#,###0"); textBox_TotalSize.Text = m_Totalsize.ToString("#,###0"); m_Leaks.Sort(Leak.CompareByTotalSize); listBox_Leaks.Items.AddRange(m_Leaks.ToArray()); }
private void addNewLeak(List <Leak> leaks, Leak currentLeak) { m_Total += 1; m_Totalsize += currentLeak.TotalSize; bool found = false; foreach (var leak in leaks) { if (!string.IsNullOrEmpty(leak.CallStack) && leak.CallStack.Equals(currentLeak.CallStack)) { found = true; leak.AddCount(); } } if (!found) { leaks.Add(currentLeak); } }
public static int CompareByTotalSize(Leak x, Leak y) { return(y.TotalSize.CompareTo(x.TotalSize)); }
public static int CompareByCount(Leak x, Leak y) { return(y.Count.CompareTo(x.Count)); }
public static int CompareBySize(Leak x, Leak y) { return(y.Size.CompareTo(x.Size)); }