Diagnosing High CPU Usage in Production Systems with Windbg
For this demonstration, we'll use a 64-bit environment with a .NET 4.0 application built with Visual Studio 2019. Ensure you have the correct version of Windbg (64-bit) installed.
Creating a Test Scenario
We'll simulate high CPU usage with a sample application containing an ententional infinite loop:
using System.Threading.Tasks;
class CpuSpikeDemo
{
static void Main()
{
Parallel.For(0, int.MaxValue, (i) =>
{
while (true) { /* Infinite loop */ }
});
}
}
Capturing Diagnostic Data
Use Procdump to capture memory dumps when CPU exceeds 70% for 5 seconds:
procdump CpuSpikeDemo -s 5 -n 2 -c 70
Analyzing the Dump File
Open the dump file in Windbg and load the necessary .NET debugging extensions:
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Identify CPU-intensive threads:
!runaway
Examine busiest thread's stack trace:
~9s
!clrstack
The stack trace will point to the problematic code location (in our case, line 14 containing the infinite loop).