【问题标题】:While debugging, how can I ensure the output without stepping into each line of code?在调试时,如何在不进入每一行代码的情况下确保输出?
【发布时间】:2013-02-23 04:37:50
【问题描述】:

在下面的控制台应用程序中,如果我在最后一行放置断点 Go();并通过按 F5 执行直到断点(在调试模式下),每次运行的结果差别不大。
控制台可以为空(不输出任何内容):

或者它可以在另一次运行时只输出部分结果:

或者,在极少数情况下,结果是“完整的”(“实际的”):

如果我按 F10 (Step Over) 或 F11 (Step into) 进行调试,执行的结果会立即输出到控制台窗口。

为什么会有这样的差异?
假设我正在使用 3d 方库调试一个应用程序,以获取我没有权限的源代码。
是否可以在不进入他们的代码的情况下确保他们的输出?

控制台应用代码:

using System;
using System.Threading;

namespace _5_2
{
  class ThreadNaming
 {
    static void Main()
    {
      Thread.CurrentThread.Name = "main";
      Thread worker = new Thread(Go);
      Thread worker2 = new Thread(Go);
      worker.Name = "1111";
      worker.Start();
      //string just4breakPoint = "aaa";
      worker2.Name = "2222";
      worker2.Start();
      Go();
      Console.ReadLine();
    }

    static void Go()
    {
      Console.WriteLine
        ("Hello from " + Thread.CurrentThread.Name);
    }
  }
}

【问题讨论】:

    标签: c# multithreading visual-studio debugging synchronization


    【解决方案1】:

    “为什么会有这样的差异?” - 这是因为单步调试引入了线程的同步,并且可能会改变事情发生的顺序。

    您将此标记为问题的事实可能表明您需要在代码中进行同步。

    【讨论】:

    • 谢谢。正如我所写,问题是我正在处理我无法访问的源代码的 3d 方库(并且在不违反许可条款的情况下无法干预它们)。我希望标题中的问题得到解决/回答
    • 我已经回答了这个问题:如果涉及多个线程,除非您有明确的同步,否则您无法保证输出顺序。无论是第三方还是您自己的代码。
    • 问题不是关于排序,而是关于在断点代码之前执行的完整输出。任意顺序
    【解决方案2】:

    只有after discussion 对我来说很清楚,为了在 F5 断点之前有完整的输出,必须通过 F10 或 F11 执行一次步进调试来同步输出。在大多数情况下,这意味着在带断点的行之后(感兴趣的行之前或之后)插入可执行代码的虚拟行,以便引入通过虚拟“步进”一次来同步输出的能力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 2012-08-11
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多