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); }
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); }