次の方法で共有


[並列スタック] ウィンドウでスレッドを表示する (C#、Visual Basic、C++)

[並列スタック] ウィンドウは、マルチスレッド アプリケーションをデバッグする場合に役立ちます。 これにはいくつかのビューがあります。

[並列スタック] ウィンドウを使用する

[並列スタック] ウィンドウを開くには、デバッグ セッション中である必要があります。 [デバッグ]>[ウィンドウ]>[並列スタック] の順に選択します。

ツール バー コントロール

[並列スタック] ウィンドウには、次のツール バー コントロールがあります。

[並列スタック] ウィンドウのツール バーのスクリーンショット。

アイコン コントロール 説明
[スレッド]/[タスク] コンボ ボックス [スレッド]/[タスク] コンボ ボックス スレッドの呼び出し履歴とタスクの呼び出し履歴の表示を切り替えます。 詳細については、タスク ビュースレッド ビューを参照してください。
[フラグが設定されているものだけを表示] アイコン [フラグが設定されているものだけを表示] [GPU スレッド] ウィンドウや [並列ウォッチ] ウィンドウなど、他のデバッガー ウィンドウでフラグが設定されているスレッドの呼び出し履歴のみを表示します。
[メソッド ビューの切り替え] アイコン メソッドビュー を切り替える コールスタックビュー とメソッドビューを切り替えます。 詳細については、「メソッド ビュー」を参照してください。
[現在のスタック フレームに自動スクロール] アイコン [現在のスタック フレームに自動スクロール] 現在のスタック フレームが表示されるようにグラフを自動スクロールします。 この機能は、他のウィンドウから現在のスタック フレームを変更する場合や、大きなダイアグラム内で新しいブレークポイントにヒットした場合に役立ちます。
[ズーム コントロールの切り替え] アイコン [ズーム コントロールの切り替え] ウィンドウの左側のズーム コントロールの表示と非表示を切り替えます。

ズーム コントロールを表示するかどうかに関係なく、Ctrl キーを押しながらマウス ホイールを回転させるか、Ctrl + Shift + + キーを押してズームインし、Ctrl + Shift + - キーを押してズームアウトすることで、ズームすることもできます。

並列スタックウィンドウ2022のツールバーのスクリーンショット。

アイコン コントロール 説明
[スレッド]/[タスク] コンボ ボックス [スレッド]/[タスク] コンボ ボックス スレッドの呼び出し履歴とタスクの呼び出し履歴の表示を切り替えます。 詳細については、タスク ビュースレッド ビューを参照してください。
[フィルター] アイコン [フィルター] コントロール 関心のある特定のスレッド セットの呼び出し履歴のみを表示します。
[フラグが設定されているものだけを表示] アイコン [フラグが設定されているものだけを表示] [GPU スレッド] ウィンドウや [並列ウォッチ] ウィンドウなど、他のデバッガー ウィンドウでフラグが設定されているスレッドの呼び出し履歴のみを表示します。
[メソッド ビューの切り替え] アイコン メソッドビュー を切り替える コールスタックビュー とメソッドビューを切り替えます。 詳細については、「メソッド ビュー」を参照してください。
[現在のスタック フレームに自動スクロール] アイコン [現在のスタック フレームに自動スクロール] 現在のスタック フレームが表示されるようにグラフを自動スクロールします。 この機能は、他のウィンドウから現在のスタック フレームを変更する場合や、大きなダイアグラム内で新しいブレークポイントにヒットした場合に役立ちます。
[ズーム コントロールの切り替え] アイコン [ズーム コントロールの切り替え] ウィンドウの左側のズーム コントロールの表示と非表示を切り替えます。

ズーム コントロールを表示するかどうかに関係なく、Ctrl キーを押しながらマウス ホイールを回転させるか、Ctrl + Shift + + キーを押してズームインし、Ctrl + Shift + - キーを押してズームアウトすることで、ズームすることもできます。
[検索] アイコン [検索] コントロール この機能を使用すると、スタック フレームを簡単に検索し、矢印を使用してそれらの結果間を移動できます。
[保存] アイコン [保存] コントロール 並列スタック ウィンドウのコンテンツを画像として保存またはエクスポートできます。
[外部コード] アイコン [外部コードの表示] コントロール この機能を使用すると、外部コードまたはライブラリからスタックを表示/非表示にすることができます。
Copilot の [要約] アイコン [呼び出し履歴の要約] Visual Studio 2022 バージョン 17.13 Preview 4 以降では、Copilot をインストールしてアクティブ化すると、要約 を選択できます。 このボタンをクリックすると、関連するスレッド コンテキストが事前に読み込まれた Copilot チャット ウィンドウが開き、スレッドの状態、関数呼び出し、推奨される修正プログラムなど、詳細を調べることができます。

スタック フレーム アイコン

次のアイコンでは、すべてのビューのアクティブおよび現在のスタック フレームに関する情報が提供されます。

アイコン 説明
黄色の矢印 現在のスレッドの現在の場所 (アクティブなスタック フレーム) を示します。
スレッド アイコン 現在のスレッド以外の現在の場所 (アクティブなスタック フレーム) を示します。
緑色の矢印 現在のスタック フレーム (現在のデバッガー コンテキスト) を示します。 メソッド名は、表示される場所に関係なく、太字になります。
アイコン 説明
黄色の矢印 現在のスレッドの現在の場所 (アクティブなスタック フレーム) を示します。
スレッド アイコン 現在のスレッド以外の現在の場所 (アクティブなスタック フレーム) を示します。
緑色の矢印 現在のスタック フレーム (現在のデバッガー コンテキスト) を示します。 メソッド名は、表示される場所に関係なく、太字になります。
状態エラー 現在のスタック フレームにデッドロックなどの重大な状態の警告があることを示します。
ステータス除外 デッドロックされたノードを示します。
ステータス情報 現在のスタック フレームに、"待機しています"、"ロックを待機しています"、"所有者" などの追加情報があることを示します。
ステータス: ブロック中 現在のタスクがブロックされた、または待機中の状態であることを示します。
状態: 実行中 現在実行中のタスクを示します。

コンテキスト メニューの項目

次のショートカット メニュー項目は、[スレッド] ビューまたは [タスク] ビューでメソッドを右クリックすると表示されます。 最後の 6 つの項目は、[呼び出し履歴] ウィンドウと同じです。

ja-JP: 並列スタックウィンドウ内のショートカットメニューのスクリーンショット。並列スタックウィンドウのショートカットメニューの

メニュー項目 説明
フラグ 選択した項目にフラグを設定します。
フラグ解除 選択した項目のフラグを解除します。
凍結 選択した項目を固定解除します。
凍結解除 選択した項目の凍結を解除します。
フレーム に切り替える 対応するメニュー コマンドは、呼び出し履歴 ウィンドウと同じです。 ただし、[並列スタック] ウィンドウでは、1 つのメソッドが複数のフレームに存在する場合があります。 この項目のサブメニューで目的のフレームを選択することができます。 スタック フレームの 1 つが現在のスレッドにある場合、既定では、そのフレームがサブメニューで選択されます。
[タスクに移動] または [スレッドに移動] [タスク] または [スレッド] ビューに切り替え、同じスタック フレームを強調表示したままにします。
ソース コードへ移動 ソース コード ウィンドウ内の対応する場所に移動します。
逆アセンブルを表示 [逆アセンブリ] ウィンドウ内の対応する場所に移動します。
外部コードを表示する 外部コードの表示と非表示を切り替えます。
16 進数で表示 10 進数と 16 進数の表示を切り替えます。
ソースのスレッドを表示 ソース コード ウィンドウ内のスレッドの場所にフラグを設定します。
シンボルの読み込み情報 [シンボルの読み込み情報] ダイアログ ボックスを開きます。
シンボル設定 シンボルの設定 ダイアログボックス を開きます。

[並列スタック] ウィンドウでのショートカット メニューのスクリーンショット 2022。[並列スタック] ウィンドウの[ショートカット メニュー]

メニュー項目 説明
コピー 選択した項目をコピーします。
下記のすべてのフレームを選択 選択したスタックの下にあるすべてのフレームを選択します。
フラグ 選択した項目にフラグを設定します。
フラグ解除 選択した項目のフラグを解除します。
凍結 選択した項目を固定解除します。
凍結解除 選択した項目の凍結を解除します。
フレーム に切り替える 対応するメニュー コマンドは、呼び出し履歴 ウィンドウと同じです。 ただし、[並列スタック] ウィンドウでは、1 つのメソッドが複数のフレームに存在する場合があります。 この項目のサブメニューで目的のフレームを選択することができます。 スタック フレームの 1 つが現在のスレッドにある場合、既定では、そのフレームがサブメニューで選択されます。
[タスクに移動] または [スレッドに移動] [タスク] または [スレッド] ビューに切り替え、同じスタック フレームを強調表示したままにします。
ソース コードへ移動 ソース コード ウィンドウ内の対応する場所に移動します。
逆アセンブルを表示 [逆アセンブリ] ウィンドウ内の対応する場所に移動します。
外部コードを表示する 外部コードの表示と非表示を切り替えます。
16 進数で表示 10 進数と 16 進数の表示を切り替えます。
ソースのスレッドを表示 ソース コード ウィンドウ内のスレッドの場所にフラグを設定します。
シンボルの読み込み情報 [シンボルの読み込み情報] ダイアログ ボックスを開きます。
シンボル設定 シンボルの設定 ダイアログボックス を開きます。

スレッド ビュー

[スレッド] ビューでは、現在のスレッドのスタック フレームと呼び出しパスが青色で強調表示されます。 スレッドの現在の場所は、黄色の矢印で示されます。

現在のスタック フレームを変更するには、別のメソッドをダブルクリックします。 これにより、選択したメソッドが現在のスレッドと別のスレッドのどちらの一部であるかに応じて、現在のスレッドも切り替わる場合があります。

[スレッド] ビュー グラフが大きすぎてウィンドウに収まらない場合は、ウィンドウに [概観] コントロールが表示されます。 コントロール内でフレームを移動して、グラフのさまざまな部分に移動できます。

次の図は、メインからマネージド、さらにネイティブ コードへと切り替わる 1 つのスレッドを示しています。 現在のメソッドには 6 つのスレッドがあります。 2 つのスレッドは Thread.Sleep に続き、2 つのスレッドは Console.WriteLine に続き、現在のスレッドは SyncTextWriter.WriteLine に続きます。

ja-JP: [並列スタック] ウィンドウの [スレッド] ビューのスクリーンショット。[並列スタック] ウィンドウの [スレッド] ビュー

次の表では、[スレッド] ビューの主な機能について説明します。

引き出し線 要素名 説明
1 呼び出し履歴のセグメントまたはノード 1 つまたは複数のスレッドの一連のメソッドが含まれます。 フレームに矢印の線が結ばれていない場合は、そのフレームではスレッドの呼び出しパス全体が表示されます。
2 青の強調表示 現在のスレッドの呼び出しパスを示します。
3 矢印の線 ノードを結び、スレッドのすべての呼び出しパスを構成します。
4 ノード ヘッダー ノードのプロセスとスレッドの数を表示します。
5 メソッド 同じメソッド内の 1 つ以上のスタック フレームを表します。
6 メソッドのツールチップ メソッドの上にカーソルを置くと表示されます。 [スレッド] ビューのツールヒントでは、すべてのスレッドが [スレッド] ウィンドウに似たテーブルに表示されます。

次の図は、マネージドからネイティブへのコード遷移でのメイン スレッドを示したものです。 現在のメソッドには 5 つのスレッドがあります。 4 つのスレッドは S.C メソッド コンテキストで実行し続けますが、1 つのワーカー スレッドはマネージドからネイティブへのコード遷移を続けて、ワーカー スレッドで名前を設定します。

2022年の並列スタック ウィンドウ内のスレッド ビューのスクリーンショット。

次の表では、[スレッド] ビューの主な機能について説明します。

引き出し線 要素名 説明
1 呼び出し履歴のセグメントまたはノード 1 つまたは複数のスレッドの一連のメソッドが含まれます。 フレームに矢印の線が結ばれていない場合は、そのフレームではスレッドの呼び出しパス全体が表示されます。
2 青の強調表示 現在のスレッドの呼び出しパスを示します。
3 矢印の線 ノードを結び、スレッドのすべての呼び出しパスを構成します。
4 ノード ヘッダー ノードのプロセスとスレッドの数、スレッド名、スレッド ID を示します。
5 メソッド 同じメソッド内の 1 つ以上のスタック フレームを表します。
6 メソッドのツールチップ メソッドの上にカーソルを置くと表示されます。 [スレッド] ビューのツールヒントでは、すべてのスレッドが [スレッド] ウィンドウに似たテーブルに表示されます。
7 スレッドの説明 AI によって生成されたスレッドの説明。 Visual Studio 2022 バージョン 17.13 Preview 1 以降では、Copilot がインストールされてアクティブにされていると、この説明が表示されます。

タスク ビュー

アプリで System.Threading.Tasks.Task オブジェクト (マネージド コード) または task_handle オブジェクト (ネイティブ コード) を使用して並列処理を表す場合は、[タスク] ビューを使用できます。 タスク ビューには、タスクの呼び出し履歴がスレッドの代わりに表示されます。

[タスク] ビューでは、次のようになります。

  • タスクを実行していないスレッドの呼び出し履歴は表示されません。
  • タスクを実行しているスレッドの呼び出し履歴は上下の項目が非表示になり、タスクに最も関連するフレームが表示されます。
  • 1 つのスレッドに複数のタスクがある場合、それらのタスクの呼び出し履歴が個々のノードに表示されます。

呼び出し履歴全体を表示するには、スタック フレームを右クリックし、[スレッドに移動] を選択して [スレッド] ビューに戻ります。

次の図の上部には [スレッド] ビュー、下部には対応する [タスク] ビューが示されています。

スレッドとタスク ビューのスクリーンショット。

[並列スタック] ウィンドウの [タスク] ビューのスクリーンショット。

メソッドの上にカーソルを置くと、ツールヒントが追加情報と共に表示されます。 [タスク] ビューのツールヒントでは、すべてのタスクが [タスク] ウィンドウに似たテーブルに表示されます。

次の図の上部には [スレッド] ビューのメソッドのツールヒント、下部には対応する [タスク] ビューのものが示されています。

スレッドとタスクのツールヒントのスクリーンショット。スレッドとタスクのツールヒントを

スレッドとタスクのツールヒントのスクリーンショット。

メソッド ビュー

[スレッド] ビューまたは [タスク] ビューで、ツール バーの [メソッド ビューの切り替え] アイコンを選択することで、現在のメソッドのグラフをピボットできます。 メソッド ビューを使用すると、現在のメソッドを呼び出すか現在のメソッドから呼び出されるすべてのスレッドのすべてのメソッドをひと目で確認できます。 次の図は、左側の [スレッド] ビューと、右側の [メソッド ビュー] で、同じ情報がどのように表示されるかを示しています。

並列スタック ウィンドウの [メソッド ビュー] のスクリーンショット。

[並列スタック] ウィンドウ 2022 の [メソッド ビュー] のスクリーンショット。

新しいスタックフレームに切り替える場合、そのメソッドを現在のメソッドとして使用し、メソッドビュー は、新しいメソッドのすべての呼び出し元と被呼び出し元を表示します。 これにより、そのメソッドが呼び出し履歴に含まれているかどうかに応じて、一部のスレッドの表示と非表示が切り替わる場合があります。 呼び出し履歴ビューに戻るには、[メソッド ビュー] ツールバー アイコンをもう一度選択します。

並列スタックを使用したスレッドとタスクのデバッグに関するビデオ チュートリアル

これらのビデオ チュートリアルでは、Visual Studio 2022 の [並列スタック] ウィンドウの [スレッド] と [タスク] ビューを使用して、マルチスレッド アプリケーションをデバッグする方法について説明します。