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");
        }
示例#2
0
        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;
                }
            }
        }
示例#4
0
        //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);
                //}
            }
        }