1

次のコンソールアプリケーションでは、最後の行にブレークポイントを設定するとGo(); F5キーを押してブレークポイントまで(デバッグモードで)実行すると、実行ごとに結果に大きな違いはありません。
コンソールは空白にすることができます(何も出力しません):

コンソールが空白です

または、別の実行で結果の一部だけを出力することもできます。

部分的な結果の出力

または、ごくまれに、結果が「完全」(「実際化」)になります。

結果は

F10(ステップオーバー)またはF11(ステップイン)でデバッグすると、実行結果がすぐにコンソールウィンドウに出力されます。

コードをステップスルーすると、結果がすぐに出力されます

なぜそのような違いがあるのですか?
サードパーティのライブラリを使用して、自分がアクセスできないソースコードにアプリケーションをデバッグしているとします。
彼らのコードに足を踏み入れることなく彼らからの出力を確実にすることは可能ですか?

コンソールアプリケーションのコード:

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 でステップ デバッグを 1 回実行して、その後の出力を同期させる必要があることを議論した結果、判明しました。ほとんどの場合、これは、実行可能コードのダミー行をブレークポイントのある行の後 (目的の行の前または後) に挿入して、ダミーの「ステップ実行」を 1 回行うことで出力を同期する機能を導入することを意味します。

于 2013-02-23T05:19:43.187 に答える