开发者

Difference between Debugger.Launch and Debugger.Break

开发者 https://www.devze.com 2023-01-17 11:44 出处:网络
What\'s the difference b开发者_JAVA百科etween Debugger.Launch(); Debugger.Break(); ?Reading the documentation, it sounds like Launch does nothing if the debugger is attached - it doesn\'t actually

What's the difference b开发者_JAVA百科etween

Debugger.Launch();
Debugger.Break();

?


Reading the documentation, it sounds like Launch does nothing if the debugger is attached - it doesn't actually break (although I haven't verified this).

Break asks to launch the debugger (if not attached), and does do the break.

In reality, it is unlikely you'd have more than one Launch point... if that.


Launch will start a debugger when one is available. But is just ignored if there is none available. Break will crash the program if no debugger is available.


More subtle differences:

  1. If a debugger is already attached, Debugger.Launch is a nop; whereas Debugger.Break will always break into the debugger.

  2. Launching a debugger does not actually break into the debugger. For example, in Visual Studio, Debugger.Launch will attach a debugger to the running process, but then you still need to do a Debug | Break in Visual Studio to actually break under the debugger.


I'm not sure if anyone actually tried what's the difference or if it's different between .NET Framework and .NET 5 but this is the behavior when I test it:

Difference between Debugger.Launch and Debugger.Break

After clicking OK VS will break on Debugger.Launch() (despite other answerers saying it will not):

Difference between Debugger.Launch and Debugger.Break

However the debugger will not break on Debugger.Launch() if it is already attached.

If I pack my project as a dotnet Tool everything is the same except it doesn't know where to break:

Difference between Debugger.Launch and Debugger.Break

TL;DR: In .NET 5:

With debugger attached:

  • .Launch() will do nothing
  • .Break() will break

Without debugger attached:

  • .Launch() will ask to attach a debugger and if you do, it will break at .Launch()
  • .Break() will do nothing (no exceptions)

Example.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>

Program.cs:

using System;
using System.Diagnostics;

Console.WriteLine("Before break");

Debugger.Break();

Console.WriteLine("After break");

Console.WriteLine("Before Launch");

Debugger.Launch();

Console.WriteLine("After Launch");
0

精彩评论

暂无评论...
验证码 换一张
取 消