チュートリアル: [スレッド] ウィンドウを使用してマルチスレッド アプリをデバッグする (C#、Visual Basic、C++)

Visual Studio のユーザー インターフェイスには、マルチスレッド アプリのデバッグに役立つ要素がいくつかあります。 この記事では、コード エディター ウィンドウ、 [デバッグの場所] ツール バー、 [スレッド] ウィンドウのマルチスレッド デバッグ機能について説明します。 マルチスレッド アプリをデバッグするための他のツールについては、マルチスレッド アプリのデバッグの開始に関するページを参照してください。

このチュートリアルを完了するには数分しかかからず、マルチスレッド アプリのデバッグの基本を理解できます。

マルチスレッド アプリ プロジェクトを作成する

このチュートリアルで使用する次のマルチスレッド アプリ プロジェクトを作成します。

  1. Visual Studio を起動し、新しいプロジェクトを作成します。

    スタート ウィンドウが開いていない場合は、 [ファイル]>[スタート ウィンドウ] を選択します。

    スタート ウィンドウで、[新しいプロジェクト] を選択します。

    スタート ウィンドウで、 [新しいプロジェクトの作成] を選択します。

    [新しいプロジェクトの作成] ウィンドウで、検索ボックスに「コンソール」と入力またはタイプします。 次に、[言語] の一覧から [C#] または [C++] を選択し、[プラットフォーム] の一覧から [Windows] を選択します。

    言語およびプラットフォームのフィルターを適用してから、.NET Core、.NET 5+、または C++ 用の [コンソール アプリ] を選択して、[次へ] を選択します。

    注意

    正しいテンプレートが表示されない場合は、 [ツール]>[ツールと機能を取得...] に移動して、Visual Studio インストーラーを開きます。 [.NET デスクトップ開発] ワークロードまたは [C++ によるデスクトップ開発] ワークロードを選択し、 [変更] を選択します。

    [新しいプロジェクトの構成] ウィンドウの [プロジェクト名] ボックスに名前を入力するか、既定の名前を使用します。 次に、 [次へ] または [作成] を選択します (いずれかのオプションを使用できます)。

    .NET Core または .NET 5+ の場合は、推奨されるターゲット フレームワークまたは .NET 8 を選択し、[作成] を選択します。

    新しいコンソール プロジェクトが表示されます。 プロジェクトが作成されると、ソース ファイルが表示されます。 選択した言語に応じて、ソース ファイル名は Program.cs または MyThreadWalkthroughApp.cpp などとなります。

  2. ソース ファイル内のコードを、マルチスレッド アプリのデバッグの開始に関するページの C# または C++ のコード例に置き換えます。

  3. [ファイル]>[すべて保存] を選択します。

[デバッグ開始]

  1. ソース コードで次の行を探します。

    Thread.Sleep(3000);
    Console.WriteLine();
    
  2. 左側の余白をクリックするか、行を選択して F9 キーを押し、Console.WriteLine(); 行にブレークポイントを設定します。

    コード行の左横の余白に、ブレークポイントが赤い円として表示されます。

  3. [デバッグ]>[デバッグの開始] を選択するか、F5 キーを押します。

    アプリがデバッグ モードで開始し、ブレークポイントで一時停止します。

  4. 中断モードの間に、 [デバッグ]>[Windows]>[スレッド] を選択して、 [スレッド] ウィンドウを開きます。 [スレッド] および他のデバッグ ウィンドウを開いたり表示したりするには、デバッグ セッションに入っている必要があります。

スレッド マーカーを調べる

  1. ソース コードで Console.WriteLine(); の行を探します。

    1. [スレッド] ウィンドウ内を右クリックし、メニューから [ソースのスレッドを表示] ソースのスレッドを表示 を選択します。

    ソース コード行の横にある余白に、"スレッド マーカー" アイコン スレッド マーカー が表示されるようになります。 スレッド マーカーは、スレッドが停止している位置を示します。 その場所で複数のスレッドが停止している場合は、複数スレッド アイコンが表示されます。

  2. スレッド マーカーの上にポインターを置きます。 データヒントが表示され、停止しているスレッドの名前とスレッド ID 番号が示されます。 スレッド名は [<No Name>] となる可能性があります。

    ヒント

    名前のないスレッドを識別するには、 [スレッド] ウィンドウでスレッドの名前を変更できます。 スレッドを右クリックし [名前の変更] を選択します。

  3. ソース コード内のスレッド マーカーを右クリックすると、ショートカット メニューに使用可能なオプションが表示されます。

スレッドに対するフラグの設定と設定解除を行う

特に注意する必要があるスレッドにフラグを付けて追跡することができます。

スレッドのフラグ付けとフラグ付け解除は、ソース コード エディターまたは [スレッド] ウィンドウから行います。 [デバッグの場所] または [スレッド] ウィンドウのツール バーから、フラグが設定されたスレッドのみ、またはすべてのスレッドを表示するかどうかを選択します。 どこで選択しても、すべての場所に反映されます。

ソース コードでスレッドのフラグを設定または解除する

  1. [表示]>[ツール バー]>[デバッグの場所] を選択し、 [デバッグの場所] ツール バーを開きます。 また、ツール バーの領域を右クリックし、 [デバッグの場所] を選択することもできます。

  2. [デバッグの場所] ツール バーには、次の 3 つのフィールドがあります: [プロセス][スレッド][スタック フレーム][スレッド] の一覧をドロップダウンして、スレッドの数を確認します。 [スレッド] の一覧では、現在実行中のスレッドは > という記号でマークされています。

  3. ソース コード ウィンドウで、余白のスレッド マーカー アイコンをポイントし、データヒントのフラグ アイコン (または空のフラグ アイコンの 1 つ) を選択します。 フラグ アイコンが赤に変わります。

    また、スレッド マーカー アイコンを右クリックし、 [フラグ] をポイントして、ショートカット メニューからフラグを付けるスレッドを選択することもできます。

  4. [デバッグの場所] ツール バーで、[スレッド] フィールドの右側にある [フラグが設定されたスレッドのみを表示] アイコン フラグが設定されたスレッドを表示 を選択します。 1 つ以上のスレッドにフラグが設定されていない場合、アイコンは淡色表示されます。

    ツール バーの [スレッド] ドロップダウンに、フラグが設定されたスレッドのみが表示されるようになります。 すべてのスレッドを再度表示するには、 [フラグが設定されたスレッドのみを表示] アイコンをもう一度クリックします。

    ヒント

    いくつかのスレッドにフラグを設定したら、コード エディターにカーソルを置いて右クリックし、 [フラグが設定されたスレッドをカーソル行の前まで実行] を選択できます。 フラグが設定されたすべてのスレッドが到達するコードを選択してください。 [フラグが設定されたスレッドをカーソル行の前まで実行] では、選択したコード行でスレッドが一時停止するので、スレッドを凍結および凍結解除することにより、実行の順序を簡単に制御できます。

  5. 現在実行中のスレッドのフラグの設定状態を切り替えるには、 [フラグが設定されたスレッドのみを表示] ボタンの左側にある、1 つのフラグの [現在のスレッドのフラグ付きの状態を切り替える] を選択します。 現在のスレッドにフラグを設定すると、フラグが設定されたスレッドのみが表示されている場合に、現在のスレッドを見つけるのに役立ちます

  6. スレッドのフラグを解除するには、ソース コードでスレッド マーカーをポイントして赤いフラグ アイコンを選択してクリアするか、スレッド マーカーを右クリックして [フラグを解除] を選択します。

[スレッド] ウィンドウでスレッドのフラグを設定および解除する

[スレッド] ウィンドウでは、フラグが設定されたスレッドの横には赤いフラグ アイコンが表示され、フラグが設定されていないスレッド (表示されている場合) には空のアウトライン アイコンが表示されます。

スレッド ウィンドウ

フラグ アイコンを選択すると、現在の状態に応じて、スレッドの状態がフラグ付きまたはフラグなしに変更されます。

また、行を右クリックして、ショートカット メニューから [フラグ設定][フラグ解除] 、または [すべてのスレッドのフラグを解除] を選択することもできます。

[スレッド] ウィンドウのツール バーには、 [フラグが設定されたスレッドのみを表示] ボタンもあります。これは 2 つのフラグ アイコンの右にある方です。 これは、 [デバッグの場所] ツール バーのボタンと同じように動作し、どちらのボタンでも両方の場所の表示が制御されます。

[スレッド] ウィンドウの他の機能

[スレッド] ウィンドウで任意の列のヘッダーを選択すると、その列の順序でスレッドが並べ替えられます。 もう一度選択すると、並べ替え順序が逆になります。 すべてのスレッドが表示されている場合、フラグ アイコン列を選択すると、フラグありまたはフラグなしの状態でスレッドが並べ替えられます。

[スレッド] ウィンドウの 2 番目の列 (ヘッダーなし) は、 [現在のスレッド] 列です。 この列の黄色の矢印は、現在の実行ポイントを示します。

[場所] 列には、ソース コードで各スレッドが出現する場所が示されています。 そのスレッドの部分的な呼び出し履歴を表示するには、 [場所] のエントリの横にある展開矢印を選択するか、エントリをポイントします。

ヒント

スレッドの呼び出し履歴をグラフィカルに表示するには、[並列スタック] ウィンドウを使用します。 ウィンドウを開くには、デバッグ中に、 [デバッグ]>[Windows]>[並列スタック] を選択します。

[フラグ設定][フラグ解除][すべてのスレッドのフラグを解除] に加えて、 [スレッド] ウィンドウの右クリック コンテキスト メニューには次の項目があります。

  • [ソースのスレッドを表示] ボタン。
  • [16 進数で表示] を使うと、 [スレッド] ウィンドウの [スレッド ID] が 10 進形式から 16 進形式に変わります。
  • [スレッドに切り替え] を使うと、実行がすぐにそのスレッドに切り替わります。
  • [名前の変更] では、スレッド名を変更できます。
  • [凍結]、[凍結解除] コマンド。

スレッドの実行を凍結および凍結解除する

スレッドを凍結および凍結解除 (一時停止と再開) して、スレッドによる処理の実行順序を制御できます。 スレッドを凍結および凍結解除すると、デッドロックや競合状態など、同時実行の問題を解決するのに役立ちます。

ヒント

他のスレッドを凍結しないで 1 つのスレッドを追跡する方法については (一般的なデバッグ シナリオでもあります)、「マルチ スレッド アプリケーションのデバッグの開始」を参照してください。

スレッドを凍結および凍結解除するには

  1. [スレッド] ウィンドウで、任意のスレッドを右クリックし、 [凍結] を選択します。 [現在のスレッド] 列の [一時停止] アイコンで、スレッドが凍結されたことが示されます。

  2. [スレッド] ウィンドウのツール バーの [列] を選択し、 [中断回数] を選択すると、 [中断回数] 列が表示されます。 凍結されたスレッドの中断回数の値は 1 です。

  3. 凍結されているスレッドを右クリックし、 [凍結解除] を選択します。

    [一時停止] アイコンが消え、 [中断回数] の値が 0 に変わります。

別のスレッドに切り替える

別のスレッドに切り替えようとすると、 [アプリケーションはブレーク モードになっています] ウィンドウが表示されることがあります。 このウィンドウでは、現在のデバッガーで表示できるコードがスレッドにないことが示されます。 たとえば、マネージド コードをデバッグしていて、スレッドがネイティブ コードであるような場合です。 このウィンドウでは、問題を解決するための指摘が提供されます。

別のスレッドに切り替えるには:

  1. [スレッド] ウィンドウで、現在のスレッド ID を記録します。これは、 [現在のスレッド] 列に黄色の矢印が表示されているスレッドです。 アプリを続行するには、このスレッドに切り替える必要があります。

  2. 別のスレッドを右クリックし、コンテキスト メニューの [スレッドに切り替え] を選択します。

  3. [スレッド] ウィンドウで黄色の矢印の位置が変わったことを確認します。 元の現在のスレッドのマーカーも、アウトラインとして残っています。

    ソース コード エディターでスレッド マーカーのツールヒントを確認し、 [デバッグの場所] ツール バーの [スレッド] ドロップダウンで一覧を確認します。 それらの場所でも、現在のスレッドが変更されていることを確認します。

  4. [デバッグの場所] ツール バーで、 [スレッド] の一覧から別のスレッドを選択します。 他の 2 つの場所でも、現在のスレッドが変更されることに注意してください。

  5. ソース コード エディターでスレッド マーカーを右クリックし、 [スレッドに切り替え] をポイントして、一覧から別のスレッドを選択します。 3 つの場所すべてで現在のスレッドが変更されることを確認します。

ソース コードのスレッド マーカーを使用すると、その場所で停止されているスレッドのみに切り替えることができます。 [スレッド] ウィンドウと [デバッグの場所] ツール バーを使用すると、任意のスレッドに切り替えることができます。

マルチスレッド アプリのデバッグの基本を学習しました。 [スレッド] ウィンドウ、 [デバッグの場所] ツール バーの [スレッド] 一覧、またはソース コード エディターのスレッド マーカーを使用して、スレッドの監視、フラグの設定と解除、スレッドの凍結と凍結解除を行うことができます。