- Install Visual Studio Code
- Install the C# Extension
- Optionally install the C# Dev Kit
- Open the folder containing the source you want to debug in VS Code - i.e., if you are debugging a test failure in System.Net.Sockets, open
runtime/src/libraries/System.Net.Sockets
- Open the debug window:
ctrl-shift-D
or click on the button on the left - Click "create a launch.json file", select the option that includes
.NET Core
from the selection dropdown - In the ".NET Core Launch (console)"
launch.json
configuration file make the following changes:- delete the
preLaunchTask
property - set
program
to the full path todotnet
in the artifacts/bin/testhost directory.- something like
{full path to your dotnet/runtime directory}/artifacts/bin/testhost/net{Version}-{OS}-{Configuration}-{Architecture}/dotnet
.
- something like
- set
cwd
to the test bin directory.- using the System.Net.Sockets example, it should be something like
{full path to your dotnet/runtime directory}/artifacts/bin/System.Net.Sockets.Tests/Debug/net{Version}-{OS}
. Exact naming/structure might differ based on which library you are debugging.
- using the System.Net.Sockets example, it should be something like
- set
args
to the command line arguments to pass to the test- something like:
[ "exec", "--runtimeconfig", "{TestProjectName}.runtimeconfig.json", "xunit.console.dll", "{TestProjectName}.dll", "-notrait", ... ]
, where TestProjectName would beSystem.Net.Sockets.Tests
- to run a specific test, you can append something like:
[ "-method", "System.Net.Sockets.Tests.{ClassName}.{TestMethodName}", ...]
- to find the exact arguments to replicate a test run you are trying to debug, run the test command in a terminal and look for output starting with
exec
. Copy all arguments and reformat them inlaunch.json
as shown above.- ex. running
dotnet build /t:Test
inruntime/src/libraries/System.Net.Sockets/tests/FunctionalTests
has terminal output including"exec --runtimeconfig System.Net.Sockets.Tests.runtimeconfig.json ... -notrait category=failing"
, which can be reformatted into["exec","--runtimeconfig","System.Net.Sockets.Tests.runtimeconfigjson", ... ,"-notrait","category=failing"]
- similarly, running
dotnet build /t:Test /p:xUnitMethodName=System.Net.Sockets.Tests.{ClassName}.{TestMethodName}
will get you the args needed to debug a specific test
- ex. running
- something like:
- delete the
- Set a breakpoint and launch the debugger (running ".NET Core Launch (console)"), inspecting variables and call stacks will now work.
- Optionally, save the launch settings in a workspace file. The advantage is that it doesn't necessarily need to reside in
.vscode
in the currently open directory, so it's much easier to preserve duringgit clean -dfx
.
To debug the libraries on a "desktop" platform (Linux/Mac/Windows, not WebAssembly, or iOS or Android) running on Mono runtime, follow the instructions below. See also Android debugging and WebAssembly debugging
-
Install the VS Code Mono Debugger (
ms-vscode.mono-debug
) extension -
Create a
launch.json
file configuration with typemono
{ "version": "0.2.0", "configurations": [ { "name": "Attach to Mono", "type": "mono", "request": "attach", "address": "localhost", "port": 1235 } ] }
-
start a test from the command line, setting the
MONO_ENV_OPTIONS
environment variable to configure the debugger:DOTNET_REMOTEEXECUTOR_SUPPORTED=0 MONO_ENV_OPTIONS="--debug --debugger-agent=transport=dt_socket,address=127.0.0.1:1235,server=y,suspend=y" ./dotnet.sh build /t:Test /p:RuntimeFlavor=Mono src/libraries/System.Buffers/tests
Note that you also have to set
DOTNET_REMOTEEXECUTOR_SUPPORTED=0
otherwise multiple instances of the runtime will attempt to listen on the same port.On Windows, do not pass
--debug
inMONO_ENV_OPTIONS
. -
Set a breakpoint in a test in VS Code and start debugging in the "Attach to Mono" configuration.
-
Note that Mono does not stop on first chance exceptions and xunit catches all exceptions, so if a test is throwing, the debugger won't break on an uncaught exception.