diff --git a/src/Tools/dotnet-gcdump/DotNetHeapDump/DotNetHeapDumpGraphReader.cs b/src/Tools/dotnet-gcdump/DotNetHeapDump/DotNetHeapDumpGraphReader.cs index 8d7836c4b9..7a8c268975 100644 --- a/src/Tools/dotnet-gcdump/DotNetHeapDump/DotNetHeapDumpGraphReader.cs +++ b/src/Tools/dotnet-gcdump/DotNetHeapDump/DotNetHeapDumpGraphReader.cs @@ -512,6 +512,7 @@ internal unsafe void ConvertHeapDataToGraph() } m_converted = true; + const int MaxNodeCount = 10_000_000; if (!m_seenStart) { @@ -712,11 +713,26 @@ internal unsafe void ConvertHeapDataToGraph() Debug.Assert(!m_graph.IsDefined(nodeIdx)); m_graph.SetNode(nodeIdx, typeIdx, objSize, m_children); + + if (m_graph.NodeCount >= MaxNodeCount) + { + doCompletionCheck = false; + m_log.WriteLine("[WARNING]: Exceeded max node count {0}. Processed {1}/{2} nodes with {3} node bulk events to go.", + MaxNodeCount, m_curNodeIdx, m_curNodeBlock.Count, m_nodeBlocks.Count); + break; + } } - if (doCompletionCheck && m_curEdgeBlock != null && m_curEdgeBlock.Count != m_curEdgeIdx) + + if (m_curEdgeBlock != null && m_curEdgeBlock.Count != m_curEdgeIdx) { - throw new ApplicationException("Error: extra edge data. Giving up on heap dump."); + m_log.WriteLine("[WARNING]: Extra edge data found. Processing edge {0}/{1} with {2} edge bulk events to go.", + m_curEdgeIdx, m_curEdgeBlock.Count, m_edgeBlocks.Count); + + if (doCompletionCheck) + { + throw new ApplicationException("Error: Giving up on heap dump."); + } } m_root.Build();