Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 100 additions & 30 deletions docs/core/tutorials/debugging-with-visual-studio-code.md
Original file line number Diff line number Diff line change
@@ -1,51 +1,76 @@
---
title: Debug a .NET console application using Visual Studio Code
description: Learn how to debug a .NET console app using Visual Studio Code.
ms.date: 10/23/2025
ms.date: 01/27/2026
zone_pivot_groups: code-editor-set-one
---
# Tutorial: Debug a .NET console application using Visual Studio Code

::: zone pivot="vscode"

This tutorial introduces the debugging tools available in Visual Studio Code for working with .NET apps.

::: zone-end

::: zone pivot="codespaces"

This tutorial introduces the debugging tools available in GitHub Codespaces for working with .NET apps.

::: zone-end

## Prerequisites

This tutorial works with the console app that you create in [Create a .NET console application using Visual Studio Code](with-visual-studio-code.md).

## Use Debug build configuration

*Debug* and *Release* are .NET's built-in build configurations. You use the Debug build configuration for debugging and the Release configuration for the final release distribution.
## Set a breakpoint

In the Debug configuration, a program compiles with full symbolic debug information and no optimization. Optimization complicates debugging, because the relationship between source code and generated instructions is more complex. The release configuration of a program has no symbolic debug information and is fully optimized.
A *breakpoint* temporarily interrupts the execution of the application before the line with the breakpoint is run.

By default, Visual Studio Code launch settings use the Debug build configuration, so you don't need to change it before debugging.
::: zone pivot="vscode"

1. Start Visual Studio Code.

1. Open the folder of the project that you created in [Create a .NET console application using Visual Studio Code](with-visual-studio-code.md).

## Set a breakpoint

A *breakpoint* temporarily interrupts the execution of the application before the line with the breakpoint is run.

1. Open the *Program.cs* file.

1. Set a *breakpoint* on the line that displays the name, date, and time, by clicking in the left margin of the code window. The left margin is to the left of the line numbers. Other ways to set a breakpoint are by pressing <kbd>F9</kbd> or choosing **Run** > **Toggle Breakpoint** from the menu while the line of code is selected.

Visual Studio Code indicates the line on which the breakpoint is set by displaying a red dot in the left margin.

:::image type="content" source="media/debugging-with-visual-studio-code/breakpoint-set-net6.png" alt-text="Breakpoint set":::
:::image type="content" source="media/debugging-with-visual-studio-code/breakpoint-set.png" alt-text="Breakpoint set":::

::: zone-end

::: zone pivot="codespaces"

1. Open your GitHub Codespace that you created in [Create a .NET console application using Visual Studio Code](with-visual-studio-code.md).

1. Open the *HelloWorld.cs* file.

1. Set a *breakpoint* on the line that displays the name, date, and time, by clicking in the left margin of the code window. The left margin is to the left of the line numbers. You can also set a breakpoint are by pressing <kbd>F9</kbd> while the line of code is selected.

:::image type="content" source="media/debugging-with-visual-studio-code/codespaces-breakpoint-set.png" alt-text="Breakpoint set":::

::: zone-end

## Start debugging

*Debug* and *Release* are .NET's built-in build configurations. You use the Debug build configuration for debugging and the Release configuration for the final release distribution.

::: zone pivot="vscode"

By default, Visual Studio Code launch settings use the Debug build configuration, so you don't need to change it before debugging.

1. Open the Debug view by selecting the Debugging icon on the left side menu.

:::image type="content" source="media/debugging-with-visual-studio-code/select-debug-pane-net6.png" alt-text="Open the Debug tab in Visual Studio Code":::
:::image type="content" source="media/debugging-with-visual-studio-code/select-debug-pane.png" alt-text="Open the Debug tab in Visual Studio Code":::

1. Select **Run and Debug**. If asked, select **C#** and then select **C#: Launch startup project**. Other ways to start the program in debugging mode are by pressing <kbd>F5</kbd> or choosing **Run** > **Start Debugging** from the menu.

:::image type="content" source="media/debugging-with-visual-studio-code/start-debugging.png" alt-text="Start debugging":::

1. If asked to **Select Launch Configuration**, select **C#: HelloWorld HelloWorld**.
1. If asked to **Select Launch Configuration**, select **C#: Debug Active File**.

1. Select the **Debug Console** tab to see the "What is your name?" prompt that the program displays before waiting for a response.

Expand All @@ -55,7 +80,29 @@ A *breakpoint* temporarily interrupts the execution of the application before th

Program execution stops when it reaches the breakpoint and before the `Console.WriteLine` method runs. The **Locals** section of the **Variables** window displays the values of variables that are defined in the currently running method.

:::image type="content" source="media/debugging-with-visual-studio-code/breakpoint-hit-net6.png" alt-text="Breakpoint hit, showing Locals":::
:::image type="content" source="media/debugging-with-visual-studio-code/breakpoint-hit.png" alt-text="Breakpoint hit, showing Locals":::

::: zone-end

::: zone pivot="codespaces"

By default, GitHub Codespaces uses the Debug build configuration, so you don't need to change it before debugging.

1. Open the Debug view by selecting the Debugging icon on the left side menu.

:::image type="content" source="media/debugging-with-visual-studio-code/codespaces-select-debug-pane.png" alt-text="Open the Debug tab in Visual Studio Code":::

1. Select **Run and Debug**. If asked, select **C#** as the debugger and then select **C#: Debug Active File** as the Launch Configuration.

1. Select the **Debug Console** tab to see the "What is your name?" prompt that the program displays before waiting for a response.

1. Enter a string in the **Debug Console** window in response to the prompt for a name, and then press <kbd>Enter</kbd>.

Program execution stops when it reaches the breakpoint and before the `Console.WriteLine` method runs. The **Locals** section of the **Variables** window displays the values of variables that are defined in the currently running method.

:::image type="content" source="media/debugging-with-visual-studio-code/codespaces-breakpoint-hit.png" alt-text="Breakpoint hit, showing Locals":::

::: zone-end

## Use the Debug Console

Expand All @@ -65,9 +112,9 @@ The **Debug Console** window lets you interact with the application you're debug

1. Enter `name = "Gracie"` at the prompt at the bottom of the **Debug Console** window and press <kbd>Enter</kbd>.

:::image type="content" source="media/debugging-with-visual-studio-code/change-variable-values-net6.png" alt-text="Change variable values":::
:::image type="content" source="media/debugging-with-visual-studio-code/change-variable-values.png" alt-text="Change variable values":::

1. Enter `currentDate = DateTime.Parse("2019-11-16T17:25:00Z").ToUniversalTime()` at the bottom of the **Debug Console** window and press <kbd>Enter</kbd>.
1. Enter `currentDate = DateTime.Parse("2026-01-28T20:54:00Z").ToUniversalTime()` at the bottom of the **Debug Console** window and press <kbd>Enter</kbd>.

The **Variables** window displays the new values of the `name` and `currentDate` variables.

Expand All @@ -77,7 +124,7 @@ The **Debug Console** window lets you interact with the application you're debug

The values displayed in the console window correspond to the changes you made in the **Debug Console**.

:::image type="content" source="media/debugging-with-visual-studio-code/changed-variable-values.png" alt-text="Terminal showing the entered values":::
:::image type="content" source="media/debugging-with-visual-studio-code/codespaces-changed-variable-values.png" alt-text="Terminal showing the entered values":::

1. Press <kbd>Enter</kbd> to exit the application and stop debugging.

Expand All @@ -87,15 +134,15 @@ The program displays the string that the user enters. What happens if the user d

1. Right-click (<kbd>Ctrl</kbd>-click on macOS) on the red dot that represents the breakpoint. In the context menu, select **Edit Breakpoint** to open a dialog that lets you enter a conditional expression.

:::image type="content" source="media/debugging-with-visual-studio-code/breakpoint-context-menu-net6.png" alt-text="Breakpoint context menu":::
:::image type="content" source="media/debugging-with-visual-studio-code/breakpoint-context-menu.png" alt-text="Breakpoint context menu":::

1. Select `Expression` in the drop-down, enter the following conditional expression, and press <kbd>Enter</kbd>.

```csharp
String.IsNullOrEmpty(name)
```

:::image type="content" source="media/debugging-with-visual-studio-code/conditional-expression-net6.png" alt-text="Enter a conditional expression":::
:::image type="content" source="media/debugging-with-visual-studio-code/conditional-expression.png" alt-text="Enter a conditional expression":::

Each time the breakpoint is hit, the debugger calls the `String.IsNullOrEmpty(name)` method, and it breaks on this line only if the method call returns `true`.

Expand Down Expand Up @@ -127,45 +174,43 @@ The program displays the string that the user enters. What happens if the user d

Visual Studio Code also allows you to step line by line through a program and monitor its execution. Ordinarily, you'd set a breakpoint and follow program flow through a small part of your program code. Since this program is small, you can step through the entire program.

1. Set a breakpoint on the opening curly brace of the `Main` method.
1. Set a breakpoint on the line of code that displays the "What is your name?" prompt.

1. Press <kbd>F5</kbd> to start debugging.

Visual Studio Code highlights the breakpoint line.

At this point, the **Variables** window shows that the `args` array is empty, and `name` and `currentDate` have default values.

1. Select **Run** > **Step Into** or press <kbd>F11</kbd>.
1. Select **Step Into** from the Debug toolbar or press <kbd>F11</kbd>.

:::image type="content" source="media/debugging-with-visual-studio-code/step-into.png" alt-text="Step-Into button":::

Visual Studio Code highlights the next line.

1. Select **Run** > **Step Into** or press <kbd>F11</kbd>.

Visual Studio Code runs the `Console.WriteLine` for the name prompt and highlights the next line of execution. The next line is the `Console.ReadLine` for the `name`. The **Variables** window is unchanged, and the **Terminal** tab shows the "What is your name?" prompt.
1. Visual Studio Code runs the `Console.WriteLine` for the name prompt and highlights the next line of execution. The next line is the `Console.ReadLine` for the `name`. The **Variables** window is unchanged, and the **Terminal** tab shows the "What is your name?" prompt.

1. Select **Run** > **Step Into** or press <kbd>F11</kbd>.
1. Select **Step Into** or press <kbd>F11</kbd>.

Visual Studio highlights the `name` variable assignment. The **Variables** window shows that `name` is still `null`.
Visual Studio Code highlights the `name` variable assignment. The **Variables** window shows that `name` is still `null`.

1. Respond to the prompt by entering a string in the Terminal tab and pressing <kbd>Enter</kbd>.

The **Debug Console** tab might not display the string you enter while you're entering it, but the <xref:System.Console.ReadLine%2A?displayProperty=nameWithType> method will capture your input.

1. Select **Run** > **Step Into** or press <kbd>F11</kbd>.
1. Select **Step Into** or press <kbd>F11</kbd>.

Visual Studio Code highlights the `currentDate` variable assignment. The **Variables** window shows the value returned by the call to the <xref:System.Console.ReadLine%2A?displayProperty=nameWithType> method. The **Terminal** tab displays the string you entered at the prompt.

1. Select **Run** > **Step Into** or press <kbd>F11</kbd>.
1. Select **Step Into** or press <kbd>F11</kbd>.

The **Variables** window shows the value of the `currentDate` variable after the assignment from the <xref:System.DateTime.Now?displayProperty=nameWithType> property.

1. Select **Run** > **Step Into** or press <kbd>F11</kbd>.
1. Select **Step Into** or press <kbd>F11</kbd>.

Visual Studio Code calls the <xref:System.Console.WriteLine(System.String,System.Object,System.Object)?displayProperty=nameWithType> method. The console window displays the formatted string.

1. Select **Run** > **Step Out** or press <kbd>Shift</kbd>+<kbd>F11</kbd>.
1. Select **Step Out** or press <kbd>Shift</kbd>+<kbd>F11</kbd>.

:::image type="content" source="media/debugging-with-visual-studio-code/step-out.png" alt-text="Step-Out button":::

Expand All @@ -177,16 +222,41 @@ Visual Studio Code also allows you to step line by line through a program and mo

Once you've tested the Debug version of your application, you should also compile and test the Release version. The Release version incorporates compiler optimizations that can affect the behavior of an application. For example, compiler optimizations that are designed to improve performance can create race conditions in multithreaded applications.

::: zone pivot="vscode"

To build and test the Release version of your console application, open the **Terminal** and run the following command:

```dotnetcli
dotnet run --configuration Release
```

::: zone-end

::: zone pivot="codespaces"

To build and test the Release version of your console application, run the following command in the terminal:

```dotnetcli
dotnet run --configuration Release HelloWorld.cs
```

::: zone-end

## Additional resources

::: zone pivot="vscode"

- [Debugging in Visual Studio Code](https://code.visualstudio.com/docs/editor/debugging)

::: zone-end

::: zone pivot="codespaces"

- [Debugging in Visual Studio Code](https://code.visualstudio.com/docs/editor/debugging)
- [GitHub Codespaces documentation](https://docs.github.com/codespaces)

::: zone-end

## Next steps

In this tutorial, you used Visual Studio Code debugging tools. In the next tutorial, you publish a deployable version of the app.
Expand Down
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading