1

在下面的控制台应用程序中,如果我在最后一行放置断点 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);
    }
  }
}
4

2 回答 2

2

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

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

于 2013-02-23T04:40:17.327 回答
0

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

于 2013-02-23T05:19:43.187 回答