[並列スタック] ウィンドウは、マルチスレッド アプリケーションをデバッグする場合に役立ちます。 これにはいくつかのビューがあります。
- スレッド ビューには、アプリのすべてのスレッドの呼び出し履歴情報が表示されます。 スレッドとそれらのスレッドのスタック フレームの間を移動できます。
-
タスク ビュー はタスク中心の呼び出し履歴情報を表示します。
- async/await パターンを使用する .NET アプリの場合、デバッグにはタスク ビューが最も役立ちます。 詳細なチュートリアルについては、「 非同期アプリケーションのデバッグ」を参照してください。
- タスク並列ライブラリ (TPL) を使用しているが、非同期/待機パターンを使用しないアプリの場合、またはコンカレンシー ランタイムを使用する C++ アプリの場合は、[並列スタック] ウィンドウの [スレッド] ビューがデバッグに最も役立つツールです。
-
タスク ビュー はタスク中心の呼び出し履歴情報を表示します。
- async/await パターンを使用する .NET アプリの場合、デバッグにはタスク ビューが最も役立ちます。
- タスク並列ライブラリ (TPL) を使用しているが、非同期/待機パターンを使用しないアプリの場合、またはコンカレンシー ランタイムを使用する C++ アプリの場合は、[並列スタック] ウィンドウの [スレッド] ビューがデバッグに最も役立つツールです。
- メソッド ビューでは、選択されたメソッドの呼び出し履歴がピボットされます。
[並列スタック] ウィンドウを使用する
[並列スタック] ウィンドウを開くには、デバッグ セッション中である必要があります。 [デバッグ]>[ウィンドウ]>[並列スタック] の順に選択します。
ツール バー コントロール
[並列スタック] ウィンドウには、次のツール バー コントロールがあります。
| アイコン | コントロール | 説明 |
|---|---|---|
|
[スレッド]/[タスク] コンボ ボックス | スレッドの呼び出し履歴とタスクの呼び出し履歴の表示を切り替えます。 詳細については、タスク ビュー と スレッド ビューを参照してください。 |
|
[フラグが設定されているものだけを表示] | [GPU スレッド] ウィンドウや [並列ウォッチ] ウィンドウなど、他のデバッガー ウィンドウでフラグが設定されているスレッドの呼び出し履歴のみを表示します。 |
|
メソッドビュー を切り替える | コールスタックビュー とメソッドビューを切り替えます。 詳細については、「メソッド ビュー」を参照してください。 |
|
[現在のスタック フレームに自動スクロール] | 現在のスタック フレームが表示されるようにグラフを自動スクロールします。 この機能は、他のウィンドウから現在のスタック フレームを変更する場合や、大きなダイアグラム内で新しいブレークポイントにヒットした場合に役立ちます。 |
|
[ズーム コントロールの切り替え] | ウィンドウの左側のズーム コントロールの表示と非表示を切り替えます。 ズーム コントロールを表示するかどうかに関係なく、Ctrl キーを押しながらマウス ホイールを回転させるか、Ctrl+Shift++ キーを押してズームインし、Ctrl+Shift+- キーを押してズームアウトすることで、ズームすることもできます。 |
| アイコン | コントロール | 説明 |
|---|---|---|
|
[スレッド]/[タスク] コンボ ボックス | スレッドの呼び出し履歴とタスクの呼び出し履歴の表示を切り替えます。 詳細については、タスク ビュー と スレッド ビューを参照してください。 |
|
[フィルター] コントロール | 関心のある特定のスレッド セットの呼び出し履歴のみを表示します。 |
|
[フラグが設定されているものだけを表示] | [GPU スレッド] ウィンドウや [並列ウォッチ] ウィンドウなど、他のデバッガー ウィンドウでフラグが設定されているスレッドの呼び出し履歴のみを表示します。 |
|
メソッドビュー を切り替える | コールスタックビュー とメソッドビューを切り替えます。 詳細については、「メソッド ビュー」を参照してください。 |
|
[現在のスタック フレームに自動スクロール] | 現在のスタック フレームが表示されるようにグラフを自動スクロールします。 この機能は、他のウィンドウから現在のスタック フレームを変更する場合や、大きなダイアグラム内で新しいブレークポイントにヒットした場合に役立ちます。 |
|
[ズーム コントロールの切り替え] | ウィンドウの左側のズーム コントロールの表示と非表示を切り替えます。 ズーム コントロールを表示するかどうかに関係なく、Ctrl キーを押しながらマウス ホイールを回転させるか、Ctrl+Shift++ キーを押してズームインし、Ctrl+Shift+- キーを押してズームアウトすることで、ズームすることもできます。 |
|
[検索] コントロール | この機能を使用すると、スタック フレームを簡単に検索し、矢印を使用してそれらの結果間を移動できます。 |
|
[保存] コントロール | 並列スタック ウィンドウのコンテンツを画像として保存またはエクスポートできます。 |
|
[外部コードの表示] コントロール | この機能を使用すると、外部コードまたはライブラリからスタックを表示/非表示にすることができます。 |
|
[呼び出し履歴の要約] | Visual Studio 2022 バージョン 17.13 Preview 4 以降では、Copilot をインストールしてアクティブ化すると、要約 を選択できます。 このボタンをクリックすると、関連するスレッド コンテキストが事前に読み込まれた Copilot チャット ウィンドウが開き、スレッドの状態、関数呼び出し、推奨される修正プログラムなど、詳細を調べることができます。 |
スタック フレーム アイコン
次のアイコンでは、すべてのビューのアクティブおよび現在のスタック フレームに関する情報が提供されます。
| アイコン | 説明 |
|---|---|
|
|
現在のスレッドの現在の場所 (アクティブなスタック フレーム) を示します。 |
|
|
非アクティブなスレッドの現在の位置(アクティブなスタックフレーム)を示します。 |
|
|
現在のスタック フレーム (現在のデバッガー コンテキスト) を示します。 メソッド名は、表示される場所に関係なく、太字になります。 |
| アイコン | 説明 |
|---|---|
|
|
現在のスレッドの現在の場所 (アクティブなスタック フレーム) を示します。 |
|
|
非現在のスレッドの現在の位置 (アクティブなスタックフレーム) を示します。 |
|
|
現在のスタック フレーム (現在のデバッガー コンテキスト) を示します。 メソッド名は、表示される場所に関係なく、太字になります。 |
|
|
(.NET)現在のスタック フレームにデッドロックなどの重大な状態の警告があることを示します。 |
|
|
(.NET)デッドロックが発生したノードを示します。 |
|
|
(.NET)現在のスタック フレームに、待機中、ロック待機、所有など、追加情報があることを示します。 |
|
|
(.NET)現在のタスクがブロック/待機状態であることを示します。 |
|
|
現在実行中のタスクを示します。 |
コンテキスト メニューの項目
次のショートカット メニュー項目は、[スレッド] ビューまたは [タスク] ビューでメソッドを右クリックすると表示されます。 最後の 6 つの項目は、[呼び出し履歴] ウィンドウと同じです。
ja-JP: 
| メニュー項目 | 説明 |
|---|---|
| フラグ | 選択した項目にフラグを設定します。 |
| フラグ解除 | 選択した項目のフラグを解除します。 |
| 凍結 | 選択した項目を固定解除します。 |
| 凍結解除 | 選択した項目の凍結を解除します。 |
| フレーム に切り替える | 対応するメニュー コマンドは、呼び出し履歴 ウィンドウと同じです。 ただし、[ 並列スタック] ウィンドウでは、1 つの方法が複数のフレームに含まれる場合があります。 この項目のサブメニューで目的のフレームを選択することができます。 スタック フレームの 1 つが現在のスレッドにある場合、既定では、そのフレームがサブメニューで選択されます。 |
| [タスクに移動] または [スレッドに移動] | [タスク] または [スレッド] ビューに切り替え、同じスタック フレームを強調表示したままにします。 |
| ソース コードへ移動 | ソース コード ウィンドウ内の対応する場所に移動します。 |
| 逆アセンブルを表示 | [逆アセンブリ] ウィンドウ内の対応する場所に移動します。 |
| 外部コードを表示する | 外部コードの表示と非表示を切り替えます。 |
| 16 進数で表示 | 10 進数と 16 進数の表示を切り替えます。 |
| ソースのスレッドを表示 | ソース コード ウィンドウ内のスレッドの場所にフラグを設定します。 |
| シンボルの読み込み情報 | [シンボルの読み込み情報] ダイアログ ボックスを開きます。 |
| シンボル設定 | シンボルの設定 ダイアログボックス を開きます。 |
| メニュー項目 | 説明 |
|---|---|
| コピー | 選択した項目をコピーします。 |
| 下記のすべてのフレームを選択 | 選択したスタックの下にあるすべてのフレームを選択します。 |
| フラグ | 選択した項目にフラグを設定します。 |
| フラグ解除 | 選択した項目のフラグを解除します。 |
| 凍結 | 選択した項目を固定解除します。 |
| 凍結解除 | 選択した項目の凍結を解除します。 |
| フレーム に切り替える | 対応するメニュー コマンドは、呼び出し履歴 ウィンドウと同じです。 ただし、[ 並列スタック] ウィンドウでは、1 つの方法が複数のフレームに含まれる場合があります。 この項目のサブメニューで目的のフレームを選択することができます。 スタック フレームの 1 つが現在のスレッドにある場合、既定では、そのフレームがサブメニューで選択されます。 |
| [タスクに移動] または [スレッドに移動] | [タスク] または [スレッド] ビューに切り替え、同じスタック フレームを強調表示したままにします。 |
| ソース コードへ移動 | ソース コード ウィンドウ内の対応する場所に移動します。 |
| 逆アセンブルを表示 | [逆アセンブリ] ウィンドウ内の対応する場所に移動します。 |
| 外部コードを表示する | 外部コードの表示と非表示を切り替えます。 |
| 16 進数で表示 | 10 進数と 16 進数の表示を切り替えます。 |
| ソースのスレッドを表示 | ソース コード ウィンドウ内のスレッドの場所にフラグを設定します。 |
| シンボルの読み込み情報 | [シンボルの読み込み情報] ダイアログ ボックスを開きます。 |
| シンボル設定 | シンボルの設定 ダイアログボックス を開きます。 |
スレッド ビュー
[スレッド] ビューでは、現在のスレッドのスタック フレームと呼び出しパスが青色で強調表示されます。 スレッドの現在の場所は、黄色の矢印で示されます。
現在のスタック フレームを変更するには、別のメソッドをダブルクリックします。 これにより、選択したメソッドが現在のスレッドと別のスレッドのどちらの一部であるかに応じて、現在のスレッドも切り替わる場合があります。
[スレッド] ビュー グラフが大きすぎてウィンドウに収まらない場合は、ウィンドウに [概観] コントロールが表示されます。 コントロール内でフレームを移動して、グラフのさまざまな部分に移動できます。
次の図は、マネージドからネイティブへのコード遷移でのメイン スレッドを示したものです。 現在のメソッドには 5 つのスレッドがあります。 4 つのスレッドは S.C メソッド コンテキストで実行し続けますが、1 つのワーカー スレッドはマネージドからネイティブへのコード遷移を続けて、ワーカー スレッドで名前を設定します。
次の表では、[スレッド] ビューの主な機能について説明します。
| 引き出し線 | 要素名 | 説明 |
|---|---|---|
| 1 | 呼び出し履歴のセグメントまたはノード | 1 つまたは複数のスレッドの一連のメソッドが含まれます。 フレームに矢印の線が結ばれていない場合は、そのフレームではスレッドの呼び出しパス全体が表示されます。 |
| 2 | 青の強調表示 | 現在のスレッドの呼び出しパスを示します。 |
| 3 | 矢印の線 | ノードを結び、スレッドのすべての呼び出しパスを構成します。 |
| 4 | ノード ヘッダー | ノードのプロセスとスレッドの数、スレッド名、スレッド ID を示します。 |
| 5 | メソッド | 同じメソッド内の 1 つ以上のスタック フレームを表します。 |
| 6 | メソッドのツールチップ | メソッドの上にカーソルを置くと表示されます。 [スレッド] ビューのツールヒントでは、すべてのスレッドが [スレッド] ウィンドウに似たテーブルに表示されます。 |
| 7 | スレッドの説明 | AI によって生成されたスレッドの説明。 Visual Studio 2022 バージョン 17.13 Preview 1 以降では、Copilot がインストールされてアクティブにされていると、この説明が表示されます。 |
AI のサポートを受ける
Copilot を使用している場合は、AI によって生成されたスレッドの説明と[分析情報の生成] ボタンを使用して、[スレッド] ビューで AI の支援を受けることができます。 [Generate Insights]\(
\) ボタンを使用して、表示されているスレッド データに関する Copilot と対話します。 このシナリオでは、Copilot は質問のコンテキストを既に認識しているため、チャットで自分でコンテキストを提供する必要はありません。 詳細については、「 Copilot を使用したデバッグ」を参照してください。
スレッドの概要の説明を有効または無効にするには、[ツール>オプション] ウィンドウを開き、[すべての設定]>[GitHub>Copilot>Debugger と診断] セクションを展開します。 [ 並列スタックで AI 概要を有効にする] ウィンドウ のチェック ボックスをオンまたはオフにします。
スレッドの概要の説明を有効または無効にするには、[ ツール>オプション ] ダイアログを開き、 GitHub>Copilot セクションを展開します。 [ デバッガーと診断 ] カテゴリで、[ 並列スタックで AI の概要を有効にする] ウィンドウ のチェック ボックスをオンまたはオフにします。
次の図は、メインからマネージド、さらにネイティブ コードへと切り替わる 1 つのスレッドを示しています。 現在のメソッドには 6 つのスレッドがあります。 2 つのスレッドは Thread.Sleep に続き、2 つのスレッドは Console.WriteLine に続き、現在のスレッドは SyncTextWriter.WriteLine に続きます。
ja-JP: ![。 [並列スタック] ウィンドウの [スレッド] ビューのスクリーンショット。[並列スタック] ウィンドウの [スレッド] ビュー](media/parallel-stack1.png?view=visualstudio)
次の表では、[スレッド] ビューの主な機能について説明します。
| 引き出し線 | 要素名 | 説明 |
|---|---|---|
| 1 | 呼び出し履歴のセグメントまたはノード | 1 つまたは複数のスレッドの一連のメソッドが含まれます。 フレームに矢印の線が結ばれていない場合は、そのフレームではスレッドの呼び出しパス全体が表示されます。 |
| 2 | 青の強調表示 | 現在のスレッドの呼び出しパスを示します。 |
| 3 | 矢印の線 | ノードを結び、スレッドのすべての呼び出しパスを構成します。 |
| 4 | ノード ヘッダー | ノードのプロセスとスレッドの数を表示します。 |
| 5 | メソッド | 同じメソッド内の 1 つ以上のスタック フレームを表します。 |
| 6 | メソッドのツールチップ | メソッドの上にカーソルを置くと表示されます。 [スレッド] ビューのツールヒントでは、すべてのスレッドが [スレッド] ウィンドウに似たテーブルに表示されます。 |
タスク ビュー
async/await パターンを使用する .NET アプリの場合、デバッグにはタスク ビューが最も役立ちます。 詳細なチュートリアルについては、「 非同期アプリケーションのデバッグ」を参照してください。
[タスク] ビューでは、次のことができます。
- async/await パターンを使用するアプリの呼び出し履歴の視覚化を表示します。
- 実行するようにスケジュールされているが、まだ実行されていない非同期コードを特定します。
次の図の上部には [スレッド] ビュー、下部には対応する [タスク] ビューが示されています。
メソッドの上にカーソルを置くと、ツールヒントが追加情報と共に表示されます。 [タスク] ビューのツールヒントでは、すべてのタスクが [タスク] ウィンドウに似たテーブルに表示されます。
次の図の上部には [スレッド] ビューのメソッドのツールヒント、下部には対応する [タスク] ビューのものが示されています。
メソッド ビュー
[スレッド] ビューまたは [タスク] ビューで、ツール バーの [メソッド ビューの切り替え] アイコンを選択することで、現在のメソッドのグラフをピボットできます。 メソッド ビューを使用すると、現在のメソッドを呼び出すか現在のメソッドから呼び出されるすべてのスレッドのすべてのメソッドをひと目で確認できます。 次の図は、左側の [スレッド] ビューと、右側の [メソッド ビュー] で、同じ情報がどのように表示されるかを示しています。
新しいスタックフレームに切り替える場合、そのメソッドを現在のメソッドとして使用し、メソッドビュー は、新しいメソッドのすべての呼び出し元と被呼び出し元を表示します。 このシナリオでは、そのメソッドが呼び出し履歴に表示されるかどうかに応じて、一部のスレッドがビューに表示または非表示になる可能性があります。 呼び出し履歴ビューに戻るには、[メソッド ビュー] ツールバー アイコンをもう一度選択します。
並列スタックを使用したスレッドとタスクのデバッグに関するビデオ チュートリアル
これらのビデオ チュートリアルでは、Visual Studio 2022 の [並列スタック] ウィンドウの [スレッド] と [タスク] ビューを使用して、マルチスレッド アプリケーションをデバッグする方法について説明します。