Debugging Docker containers running .NET
Ever had a memory leak and wanted to diagnose it? Luckily there are some free tools from Microsoft that you can install and use!
This is a two part series:
Modify your Dockfile to use .NET SDK
For example here we're changing from aspnet 3.1
to sdk 3.1
. This allows us to install the debugging tools later on
-FROM mcr.microsoft.com/dotnet/aspnet:3.1.10-alpine3.12 AS base
+FROM mcr.microsoft.com/dotnet/sdk:3.1.404-alpine3.12 AS base
Launch a terminal for a running container
There are a few ways to do this for example using Visual Studio or jumping into a CLI environment on the Docker container.
While in Visual Studio and debugging, navigate to the 'Containers' window and select 'Open Terminal Window'
Install the tools
Now, having access to the container using CLI, install tools such as dotnet-counters
, donet-dump
ot dotnet-trace
. See Debugging a memory leak for more information.
dotnet tool install --global dotnet-trace
dotnet tool install --global dotnet-counters
dotnet tool install --global dotnet-dump
export PATH="$PATH:/root/.dotnet/tools"
Collect
These example are basically taken from Debugging a memory leak. Each command will generate a file you can open in Visual Studio once generated. To generate, Ctrl+C
on the process to end it.
CPU
dotnet-trace collect --process-id $(pidof dotnet) --providers Microsoft-DotNETCore-SampleProfiler
Observe Memory
This will monitor memory usage in real time but not generate a file.
dotnet-counters monitor --process-id $(pidof dotnet) --refresh-interval 1
Memory dump collection
This will generate file to analyze memory usage with.
dotnet-dump collect --process-id $(pidof dotnet)
To analyze the memory dump file you can refer again to Debugging a memory leak.