Running console application that creates and joins with short-lived threads leaks handles when debugger is attached

Open
#109,103 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Stale
Tech stack
csharp

Research direction

Start by reproducing the short-lived-thread loop under Visual Studio Code, Visual Studio, JetBrains Rider, dotnet run, and WinDbg on Windows 11 x64. Investigate the managed debugging code implicated by the report and compare handle counts; done means the count remains stable under the affected debuggers as it does with dotnet run and WinDbg.

Written by the indexing model from the issue text.

Description

area-Diagnostics-coreclr
Description

When the debugger is attached to an application that repeatedly creates and joins with short-lived threads, performance monitor shows the handles associated with the application growing linearly. The growth was observed when run with the debugger in Visual Studio Code, Visual Studio and JetBrains Rider.

When the same application is run via "dotnet run" from a terminal, the handle count is stable.

Reproduction Steps
while (true)
{
    var thread = new Thread(() => Thread.Sleep(1_000));
    thread.Start();
    thread.Join();
    GC.Collect();
    GC.WaitForPendingFinalizers();
    Console.WriteLine($"{DateTime.Now} iterate");
}
Expected behavior

It is expected that performance monitor would show the handle count as stable like it shows when run via "dotnet run". Below is a screenshot of what performance monitor shows when running the application under "dotnet run".
Image

Actual behavior

Below is a screenshot of what performance monitor shows when run with the debugger in Visual Studio Code. The same growth is observed when run with the debugger attached in Visual Studio and JetBrains Rider.
Image

Regression?

The application running under the debugger shows the growth in the handles in .NET 8 and .NET Framework 4.8.

Known Workarounds

No response

Configuration

.NET 8 and .NET Framework 4.8
Windows 11
x64

Other information

When the application is run under WinDbg, it does not show growth in the handles. So possibly it is in the managed debugging code.

Dominant language
C#
Stars
18.3k
Forks
5.6k
PR merge metrics
PR metrics pending

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from dotnet/runtime

All issues in dotnet/runtime

Similar issues

More C# issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.