34

有什么区别

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

?

4

4 回答 4

22

阅读文档,如果附加了调试器,听起来好像Launch什么都不做——它实际上并没有中断(尽管我还没有验证这一点)。

Break 要求启动调试器(如果未附加),并确实中断。

实际上,您不太可能获得超过一Launch分……如果那样的话。

于 2010-09-21T10:39:16.847 回答
20

Launch 将在可用时启动一个调试器。但是,如果没有可用的,则将被忽略。如果没有可用的调试器,Break 将使程序崩溃。

于 2010-09-21T11:18:30.900 回答
10

更细微的区别:

  1. 如果已附加调试器,则 Debugger.Launch 是nop;而 Debugger.Break总是会闯入调试器。

  2. 启动调试器实际上并不会中断调试器。例如,在 Visual Studio 中,Debugger.Launch会将调试器附加到正在运行的进程,但随后您仍然需要执行 Debug | 在 Visual Studio 中中断以在调试器下实际中断。

于 2010-12-12T05:23:34.743 回答
4

我不确定是否有人真正尝试过有什么区别,或者 .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");
于 2021-02-25T09:23:05.357 回答