Debugger.Launch 和 Debugger.Break 的区别

Posted

技术标签:

【中文标题】Debugger.Launch 和 Debugger.Break 的区别【英文标题】:Difference between Debugger.Launch and Debugger.Break 【发布时间】:2011-04-15 03:07:59 【问题描述】:

有什么区别

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

?

【问题讨论】:

【参考方案1】:

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

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

实际上,您不太可能拥有多个Launch 点...如果那样的话。

【讨论】:

【参考方案2】:

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

【讨论】:

尤其是崩溃提示很有帮助。我刚刚发现我的发布版本应用程序由于忘记了 debug.break 而崩溃。我以为调用只会在调试版本中执行...我错了...【参考方案3】:

更细微的区别:

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

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

【讨论】:

【参考方案4】:

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

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

但是,如果 Debugger.Launch() 已经附加,调试器将不会中断。

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

TL;DR: 在 .NET 5 中:

附加调试器:

.Launch() 什么都不做 .Break() 会崩溃

没有附加调试器:

.Launch() 会要求附加一个调试器,如果你这样做了,它将在 .Launch() 处中断 .Break() 什么都不做(没有例外)

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

【讨论】:

我用 .NET Framework 验证了相同的“未附加调试器”行为。

以上是关于Debugger.Launch 和 Debugger.Break 的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何在Visual Studio中调试Windows服务?

调试 windows服务

EF6 根据数据库字段说明,生成字段注释

Windows服务:无法启动服务。服务进程无法连接到服务控制器

如何在函数的 N 次递归调用中中断程序?

横向移动之WMI和WinRM和impacket简易使用[坑]