有什么区别
Debugger.Launch();
Debugger.Break();
?
阅读文档,如果附加了调试器,听起来好像Launch
什么都不做——它实际上并没有中断(尽管我还没有验证这一点)。
Break
要求启动调试器(如果未附加),并确实中断。
实际上,您不太可能获得超过一Launch
分……如果那样的话。
Launch 将在可用时启动一个调试器。但是,如果没有可用的,则将被忽略。如果没有可用的调试器,Break 将使程序崩溃。
更细微的区别:
如果已附加调试器,则 Debugger.Launch 是nop;而
Debugger.Break
总是会闯入调试器。
启动调试器实际上并不会中断调试器。例如,在 Visual Studio 中,Debugger.Launch
会将调试器附加到正在运行的进程,但随后您仍然需要执行 Debug | 在 Visual Studio 中中断以在调试器下实际中断。
我不确定是否有人真正尝试过有什么区别,或者 .NET Framework 和 .NET 5 之间是否有所不同,但这是我测试它时的行为:
单击 OK 后,VS 将中断Debugger.Launch()
(尽管其他回答者说不会):
但是,如果它已经附加,调试器将不会中断。Debugger.Launch()
如果我将我的项目打包为 dotnet 工具,一切都是一样的,只是它不知道在哪里中断:
TL;DR:在 .NET 5 中:
附加调试器:
.Launch()
什么都不做.Break()
会断没有附加调试器:
.Launch()
会要求附加一个调试器,如果你这样做,它会在.Launch()
.Break()
什么都不做(没有例外)示例.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>
程序.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");