private void Snapshot(object sender, RoutedEventArgs e) { status.Text = string.Empty; if (_process == null) { MessageBox.Show(this, "Monitor a process before snapshotting it", "Snapshot", MessageBoxButton.OK); return; } try { ResetUI(); var sw = new Stopwatch(); sw.Start(); _analyzer = DiagnosticAnalyzer.FromSnapshot(_process.Id); //_analyzer = DiagnosticAnalyzer.FromProcess(_process.Id); var elapsed = sw.Elapsed; status.Text = $"Process {_process.Id} snapshot took {sw.ElapsedMilliseconds}ms"; 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); //} } }