private void OpenDump(object sender, RoutedEventArgs e) { status.Text = string.Empty; Close(null, null); var filename = FileHelper.OpenDialog(this, "Select a dump file"); if (string.IsNullOrEmpty(filename)) { return; } var fi = new FileInfo(filename); if (fi.Exists) { try { _analyzer = DiagnosticAnalyzer.FromDump(fi.FullName, true); ComboQueries.IsEnabled = true; } catch (Exception err) { _analyzer = null; ComboQueries.IsEnabled = false; status.Text = err.Message; return; } } UpdateStatus($"File {fi.Name} loaded"); }
public void Analyze() { var fullDumpName = Path.Combine(_dumpDir, _dumpName); var analyzer = DiagnosticAnalyzer.FromDump(fullDumpName, true); var collectibles = analyzer.Objects .Where(o => o.Type.IsCollectible).ToList(); var allocator = analyzer.GetObjectsGroupedByAllocator(analyzer.Objects); //var objs = analyzer.GetObjectsOfType("System.Reflection.LoaderAllocator", true); var objs = analyzer.Objects .Where(o => o.Type.Name == "System.Reflection.LoaderAllocator"); foreach (var leakedObj in objs) { var leakedType = leakedObj.Type; Console.WriteLine($"{leakedType.Name} Addr:0x{leakedObj.Address:X} Size:{leakedObj.Size} MT:0x{leakedType.MethodTable:X}"); var roots = analyzer.RootPaths(leakedObj.Address); bool isFirst = true; int i = 0; foreach (var root in roots) { if (isFirst) { Console.WriteLine($"Root {root.Root.RootKind} Addr:{root.Root.Address} {root.Root.Object.Type.Name} Addr:{root.Root.Address} alloc:{root.Root.Object.Type.LoaderAllocatorHandle:X16}"); isFirst = false; } Console.WriteLine($" Path {i++}"); foreach (var path in root.Path) { Console.WriteLine($" {path.Address:X16} {path.Type.Name} alloc:{leakedType.LoaderAllocatorHandle:X16}"); var result = FindReferencing(analyzer, false, path.Address); if (result.Count > 0) { Console.WriteLine($" Objects whose fields point to {path.Address:X16}"); foreach (var res in result) { string isStaticString = res.isStatic ? "static" : "instance"; Console.WriteLine($" {res.address:X16} Type:{res.typeName} field:{res.fieldName} {isStaticString}"); } } } Console.WriteLine(); } } analyzer.Dispose(); }
private void OpenDump(object sender, RoutedEventArgs e) { status.Text = string.Empty; Close(null, null); var filename = FileHelper.OpenDialog(this, "Select a dump file"); if (File.Exists(filename)) { try { _analyzer = DiagnosticAnalyzer.FromDump(filename, true); ComboQueries.IsEnabled = true; } catch (Exception err) { _analyzer = null; ComboQueries.IsEnabled = false; status.Text = err.Message; } } }
//private static string _dumpName = "jsonnet.dmp"; //private static string _pdbName = "NetCore3.pdb"; public void Analyze() { DiagnosticAnalyzer analyzer; var ps = ProcessHelper.GetProcess("TestWebApp"); if (ps == null) { var fullDumpName = Path.Combine(_dumpDir, _dumpName); //var fullPdbName = Path.Combine(_dumpDir, _pdbName); //analyzer = DiagnosticAnalyzer.FromDump(fullDumpName, true, fullPdbName); analyzer = DiagnosticAnalyzer.FromDump(fullDumpName, true); } else { Stopwatch sw = new Stopwatch(); sw.Start(); analyzer = DiagnosticAnalyzer.FromSnapshot(ps.Id); var elapsed = sw.Elapsed; Console.WriteLine($"Process snapshot took {sw.ElapsedMilliseconds}ms"); } using (analyzer) { analyzer.PrintClrStack(); analyzer.PrintDumpHeapStat(0); var testObjects = analyzer.Objects .Where(o => o.Type.Name == null || (!o.Type.IsFree && !o.Type.Name.Contains("System"))).ToList(); var mine = analyzer.Objects.Where(o => o.Type.MethodTable == 0x00007ffefd118688).FirstOrDefault(); var jsonConvert = analyzer.Objects .Where(o => o.Type.Name != null && o.Type.Name.Equals("Newtonsoft.Json.Serialization.JsonProperty")) .FirstOrDefault(); var byAllocatorAddress = analyzer.GetObjectsGroupedByAllocator(analyzer.Objects).ToList(); foreach (var item in byAllocatorAddress) { var allocatorName = analyzer.GetAllocatorName(item.allocator); } var staticFields = analyzer.GetStaticFields().ToList(); var staticFieldsWithGraphSize = analyzer.GetStaticFieldsWithGraphSize().ToList(); var staticFieldsWithGraphAndSize = analyzer.GetStaticFieldsWithGraphAndSize().ToList(); var dups = analyzer.GetDuplicateStrings(); var large = analyzer.GetObjectsBySize(); var largeStrings = analyzer.GetStringsBySize(256); var dumpHeapStat = analyzer.DumpHeapStat(0); // the following object arrays hold the statics and are counted in SOS "DumpHeap -stat" // The pinned objects are the missing ones, the other two are already in the previous list var objArray = analyzer.Roots.Where(r => r.Object.Type.Name == "System.Object[]").ToList(); //foreach(var str in analyzer.GetStringsBySize(80, 100)) //{ // var s1 = str.Item1.AsString(); // var s2 = str.Item2; // Console.WriteLine(s1); // Console.WriteLine(s2); //} } }