예제 #1
0
        static void Main(string[] args)
        {
            var path     = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
            var dumpData = DataTarget.LoadCrashDump("C:\\Work\\neil-dumps\\Raven.Server.crashdump");

            dumpData.SetSymbolPath(path);
            string dacLocation;

            using (var dacLocator = DacLocator.FromPublicSymbolServer("C:\\localsymbols"))
                dacLocation = dacLocator.FindDac(dumpData.ClrVersions[0]);

            var runtime = dumpData.CreateRuntime(dacLocation);
            var heap    = runtime.GetHeap();

            currentHeap          = heap;
            heapObjectsByPointer = new Dictionary <ulong, ClrType>();
            if (!heap.CanWalkHeap)
            {
                throw new ApplicationException("Cannot walk heap --> unable to proceed!");
            }

            //clrstack -p -l
            heap.EnumerateObjects().ToList()
            .ForEach(objPtr => heapObjectsByPointer.Add(objPtr, heap.GetObjectType(objPtr)));

            var threadStackTracesGroupBySimilarity = runtime.Threads.Where(t => t.IsAlive &&
                                                                           !t.IsUserSuspended &&
                                                                           !t.IsGC &&
                                                                           t.StackTrace.Count > 1)
                                                     .Select(row => new StackTraceGroupedBySimilarity
            {
                ThreadId        = row.ManagedThreadId,
                StackBase       = row.StackBase,
                StackTrace      = row.StackTrace,
                SimilarityCount = runtime.Threads.Count(t => StackTraceUtil.StackTraceSimilarity(row.StackTrace, t.StackTrace) >= SIMILARITY_THRESHOLD)
            })
                                                     .OrderByDescending(row => row.SimilarityCount)
                                                     .ToList();

            var afterDistinct = new List <StackTraceGroupedBySimilarity>();

            foreach (var stackTraceData in threadStackTracesGroupBySimilarity)
            {
                if (
                    !afterDistinct.Any(
                        row =>
                        StackTraceUtil.StackTraceSimilarity(row.StackTrace, stackTraceData.StackTrace) >=
                        SIMILARITY_THRESHOLD))
                {
                    afterDistinct.Add(stackTraceData);
                }
            }

            DumpStackTraceOccurenceToExcel(afterDistinct.OrderByDescending(row => row.SimilarityCount).Take(5).ToList());
            //DumpStackTraceToExcelByThreads(stackTraceDataByThreads);
        }
예제 #2
0
            public override bool Equals(object obj)
            {
                if (ReferenceEquals(null, obj))
                {
                    return(false);
                }
                if (ReferenceEquals(this, obj))
                {
                    return(true);
                }
                var otherObject = obj as StackTraceGroupedBySimilarity;

                return(otherObject != null && StackTraceUtil.CompareStackTraces(StackTrace, otherObject.StackTrace) >= 50.0m);
            }