Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Debugger.Launch和Debugger.Break之间的差异_C#_.net_Debugging_System.diagnostics - Fatal编程技术网

C# Debugger.Launch和Debugger.Break之间的差异

C# Debugger.Launch和Debugger.Break之间的差异,c#,.net,debugging,system.diagnostics,C#,.net,Debugging,System.diagnostics,两者之间有什么区别 Debugger.Launch(); Debugger.Break(); ?阅读文档时,如果附加了调试器,Launch听起来好像什么都不做-它实际上没有中断(尽管我还没有验证这一点) Break请求启动调试器(如果未连接),并执行中断操作 实际上,您不太可能有多个Launch点。。。如果是这样。启动将在调试器可用时启动调试器。但如果没有可用的,则忽略。如果没有可用的调试器,Break将使程序崩溃。更微妙的区别: 如果已附加调试器,则debugger.Launch为;鉴于 D

两者之间有什么区别

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

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

Break
请求启动调试器(如果未连接),并执行中断操作


实际上,您不太可能有多个
Launch
点。。。如果是这样。

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

更微妙的区别:

  • 如果已附加调试器,则debugger.Launch为;鉴于
    Debugger.Break
    将始终中断 进入调试器

  • 发起 调试器实际上并没有中断 进入调试器。例如,在 Visual Studio,
    Debugger.Launch
    将附加一个 将调试器添加到正在运行的进程,但 然后您仍然需要进行调试| 在VisualStudio中中断以实际中断 调试器


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

    单击“确定”后,VS将在
    调试器.Launch()
    上中断(尽管其他回答者说不会):

    但是,如果调试器已连接,则调试器不会在
    debugger.Launch()
    上中断

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

    TL;DR:在.NET 5中:

    已附加调试器:

    • .Launch()
      将不起任何作用
    • .Break()
      将中断
    未连接调试器:

    • .Launch()
      将要求附加调试器,如果附加调试器,它将在
      .Launch()
    • .Break()
      将不起任何作用(无例外)

    示例.csproj:

    
    Exe
    net5.0
    
    Program.cs:

    使用系统;
    使用系统诊断;
    控制台。写入线(“中断前”);
    Debugger.Break();
    控制台。写入线(“中断后”);
    Console.WriteLine(“发射前”);
    Debugger.Launch();
    控制台。WriteLine(“启动后”);
    
    特别是对崩溃的提示很有帮助。我刚刚发现我的发布版本应用程序由于忘记了debug.break而崩溃。我以为调用只会在调试版本中执行…我错了。。。