Debugger.Launch和Debugger.Break之间的区别

时间:2010-09-21 10:17:13

标签: c# .net debugging system.diagnostics

之间有什么区别
Debugger.Launch();
Debugger.Break();

4 个答案:

答案 0 :(得分:19)

阅读文档时,如果附加调试器,Launch听起来没有任何作用 - 它实际上并没有中断(尽管我还没有验证过这一点)。

Break 要求启动调试器(如果没有附加), 执行中断。

实际上,你不太可能有Launch点......如果那样的话。

答案 1 :(得分:15)

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

答案 2 :(得分:8)

更微妙的差异:

  1. 如果已附加调试器,则Debugger.Launch为nop;而 Debugger.Break将永远破裂 进入调试器。

  2. 启动一个 调试器实际上并没有破坏 进入调试器。例如,在 Visual Studio Debugger.Launch将附加一个 调试程序到正在运行的进程,但是 那你还需要做一个Debug | 在Visual Studio中打破以实际打破 调试器。

答案 3 :(得分:3)

我不确定是否有人真正尝试过 .NET Framework 和 .NET 5 之间的区别或区别,但这是我测试时的行为:

result when running the example

点击确定后 VS 将在 Debugger.Launch() 上中断(尽管其他回答者说不会):

enter image description here

但是,如果调试器已经连接,它不会Debugger.Launch() 上中断。

如果我将我的项目打包为 dotnet 工具,一切都一样,只是它不知道在哪里中断:

enter image description here

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>

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");