[並列スタック] ウィンドウでスレッドを表示する (C#、Visual Basic、C++)
[並列スタック] ウィンドウは、マルチスレッド アプリケーションをデバッグする場合に役立ちます。 これにはいくつかのビューがあります。
スレッド ビューには、アプリのすべてのスレッドの呼び出し履歴情報が表示されます。 スレッドとそれらのスレッドのスタック フレームの間を移動できます。
タスク ビュー はタスク中心の呼び出し履歴情報を表示します。
- マネージド コードでは、[タスク] ビューに、System.Threading.Tasks.Task オブジェクトの呼び出し履歴が表示されます。
- ネイティブ コードでは、[タスク] ビューに、タスク グループ、並列アルゴリズム、非同期エージェント、および軽量タスクの呼び出し履歴が表示されます。
メソッド ビューでは、選択されたメソッドの呼び出し履歴がピボットされます。
[並列スタック] ウィンドウを使用する
[並列スタック] ウィンドウを開くには、デバッグ セッション中である必要があります。 [デバッグ]>[ウィンドウ]>[並列スタック] の順に選択します。
ツール バー コントロール
[並列スタック] ウィンドウには、次のツール バー コントロールがあります。
アイコン | コントロール | 説明 |
---|---|---|
![]() |
[スレッド]/[タスク] コンボ ボックス | スレッドの呼び出し履歴とタスクの呼び出し履歴の表示を切り替えます。 詳細については、タスク ビュー と スレッド ビューを参照してください。 |
![]() |
[フラグが設定されているものだけを表示] | [GPU スレッド] ウィンドウや [並列ウォッチ] ウィンドウなど、他のデバッガー ウィンドウでフラグが設定されているスレッドの呼び出し履歴のみを表示します。 |
![]() |
メソッドビュー を切り替える | コールスタックビュー とメソッドビューを切り替えます。 詳細については、「メソッド ビュー」を参照してください。 |
![]() |
[現在のスタック フレームに自動スクロール] | 現在のスタック フレームが表示されるようにグラフを自動スクロールします。 この機能は、他のウィンドウから現在のスタック フレームを変更する場合や、大きなダイアグラム内で新しいブレークポイントにヒットした場合に役立ちます。 |
![]() |
[ズーム コントロールの切り替え] | ウィンドウの左側のズーム コントロールの表示と非表示を切り替えます。 ズーム コントロールを表示するかどうかに関係なく、Ctrl キーを押しながらマウス ホイールを回転させるか、Ctrl + Shift + + キーを押してズームインし、Ctrl + Shift + - キーを押してズームアウトすることで、ズームすることもできます。 |
アイコン | コントロール | 説明 |
---|---|---|
![]() |
[スレッド]/[タスク] コンボ ボックス | スレッドの呼び出し履歴とタスクの呼び出し履歴の表示を切り替えます。 詳細については、タスク ビュー と スレッド ビューを参照してください。 |
![]() |
[フィルター] コントロール | 関心のある特定のスレッド セットの呼び出し履歴のみを表示します。 |
![]() |
[フラグが設定されているものだけを表示] | [GPU スレッド] ウィンドウや [並列ウォッチ] ウィンドウなど、他のデバッガー ウィンドウでフラグが設定されているスレッドの呼び出し履歴のみを表示します。 |
![]() |
メソッドビュー を切り替える | コールスタックビュー とメソッドビューを切り替えます。 詳細については、「メソッド ビュー」を参照してください。 |
![]() |
[現在のスタック フレームに自動スクロール] | 現在のスタック フレームが表示されるようにグラフを自動スクロールします。 この機能は、他のウィンドウから現在のスタック フレームを変更する場合や、大きなダイアグラム内で新しいブレークポイントにヒットした場合に役立ちます。 |
![]() |
[ズーム コントロールの切り替え] | ウィンドウの左側のズーム コントロールの表示と非表示を切り替えます。 ズーム コントロールを表示するかどうかに関係なく、Ctrl キーを押しながらマウス ホイールを回転させるか、Ctrl + Shift + + キーを押してズームインし、Ctrl + Shift + - キーを押してズームアウトすることで、ズームすることもできます。 |
![]() |
[検索] コントロール | この機能を使用すると、スタック フレームを簡単に検索し、矢印を使用してそれらの結果間を移動できます。 |
![]() |
[保存] コントロール | 並列スタック ウィンドウのコンテンツを画像として保存またはエクスポートできます。 |
![]() |
[外部コードの表示] コントロール | この機能を使用すると、外部コードまたはライブラリからスタックを表示/非表示にすることができます。 |
![]() |
[呼び出し履歴の要約] | Visual Studio 2022 バージョン 17.13 Preview 4 以降では、Copilot をインストールしてアクティブ化すると、要約 を選択できます。 このボタンをクリックすると、関連するスレッド コンテキストが事前に読み込まれた Copilot チャット ウィンドウが開き、スレッドの状態、関数呼び出し、推奨される修正プログラムなど、詳細を調べることができます。 |
スタック フレーム アイコン
次のアイコンでは、すべてのビューのアクティブおよび現在のスタック フレームに関する情報が提供されます。
アイコン | 説明 |
---|---|
![]() |
現在のスレッドの現在の場所 (アクティブなスタック フレーム) を示します。 |
![]() |
現在のスレッド以外の現在の場所 (アクティブなスタック フレーム) を示します。 |
![]() |
現在のスタック フレーム (現在のデバッガー コンテキスト) を示します。 メソッド名は、表示される場所に関係なく、太字になります。 |
アイコン | 説明 |
---|---|
![]() |
現在のスレッドの現在の場所 (アクティブなスタック フレーム) を示します。 |
![]() |
現在のスレッド以外の現在の場所 (アクティブなスタック フレーム) を示します。 |
![]() |
現在のスタック フレーム (現在のデバッガー コンテキスト) を示します。 メソッド名は、表示される場所に関係なく、太字になります。 |
![]() |
現在のスタック フレームにデッドロックなどの重大な状態の警告があることを示します。 |
![]() |
デッドロックされたノードを示します。 |
![]() |
現在のスタック フレームに、"待機しています"、"ロックを待機しています"、"所有者" などの追加情報があることを示します。 |
![]() |
現在のタスクがブロックされた、または待機中の状態であることを示します。 |
![]() |
現在実行中のタスクを示します。 |
コンテキスト メニューの項目
次のショートカット メニュー項目は、[スレッド] ビューまたは [タスク] ビューでメソッドを右クリックすると表示されます。 最後の 6 つの項目は、[呼び出し履歴] ウィンドウと同じです。
ja-JP:
メニュー項目 | 説明 |
---|---|
フラグ | 選択した項目にフラグを設定します。 |
フラグ解除 | 選択した項目のフラグを解除します。 |
凍結 | 選択した項目を固定解除します。 |
凍結解除 | 選択した項目の凍結を解除します。 |
フレーム に切り替える | 対応するメニュー コマンドは、呼び出し履歴 ウィンドウと同じです。 ただし、[並列スタック] ウィンドウでは、1 つのメソッドが複数のフレームに存在する場合があります。 この項目のサブメニューで目的のフレームを選択することができます。 スタック フレームの 1 つが現在のスレッドにある場合、既定では、そのフレームがサブメニューで選択されます。 |
[タスクに移動] または [スレッドに移動] | [タスク] または [スレッド] ビューに切り替え、同じスタック フレームを強調表示したままにします。 |
ソース コードへ移動 | ソース コード ウィンドウ内の対応する場所に移動します。 |
逆アセンブルを表示 | [逆アセンブリ] ウィンドウ内の対応する場所に移動します。 |
外部コードを表示する | 外部コードの表示と非表示を切り替えます。 |
16 進数で表示 | 10 進数と 16 進数の表示を切り替えます。 |
ソースのスレッドを表示 | ソース コード ウィンドウ内のスレッドの場所にフラグを設定します。 |
シンボルの読み込み情報 | [シンボルの読み込み情報] ダイアログ ボックスを開きます。 |
シンボル設定 | シンボルの設定 ダイアログボックス を開きます。 |
メニュー項目 | 説明 |
---|---|
コピー | 選択した項目をコピーします。 |
下記のすべてのフレームを選択 | 選択したスタックの下にあるすべてのフレームを選択します。 |
フラグ | 選択した項目にフラグを設定します。 |
フラグ解除 | 選択した項目のフラグを解除します。 |
凍結 | 選択した項目を固定解除します。 |
凍結解除 | 選択した項目の凍結を解除します。 |
フレーム に切り替える | 対応するメニュー コマンドは、呼び出し履歴 ウィンドウと同じです。 ただし、[並列スタック] ウィンドウでは、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 つのワーカー スレッドはマネージドからネイティブへのコード遷移を続けて、ワーカー スレッドで名前を設定します。
次の表では、[スレッド] ビューの主な機能について説明します。
引き出し線 | 要素名 | 説明 |
---|---|---|
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 つのスレッドに複数のタスクがある場合、それらのタスクの呼び出し履歴が個々のノードに表示されます。
呼び出し履歴全体を表示するには、スタック フレームを右クリックし、[スレッドに移動] を選択して [スレッド] ビューに戻ります。
次の図の上部には [スレッド] ビュー、下部には対応する [タスク] ビューが示されています。
メソッドの上にカーソルを置くと、ツールヒントが追加情報と共に表示されます。 [タスク] ビューのツールヒントでは、すべてのタスクが [タスク] ウィンドウに似たテーブルに表示されます。
次の図の上部には [スレッド] ビューのメソッドのツールヒント、下部には対応する [タスク] ビューのものが示されています。
メソッド ビュー
[スレッド] ビューまたは [タスク] ビューで、ツール バーの [メソッド ビューの切り替え] アイコンを選択することで、現在のメソッドのグラフをピボットできます。 メソッド ビューを使用すると、現在のメソッドを呼び出すか現在のメソッドから呼び出されるすべてのスレッドのすべてのメソッドをひと目で確認できます。 次の図は、左側の [スレッド] ビューと、右側の [メソッド ビュー] で、同じ情報がどのように表示されるかを示しています。
新しいスタックフレームに切り替える場合、そのメソッドを現在のメソッドとして使用し、メソッドビュー は、新しいメソッドのすべての呼び出し元と被呼び出し元を表示します。 これにより、そのメソッドが呼び出し履歴に含まれているかどうかに応じて、一部のスレッドの表示と非表示が切り替わる場合があります。 呼び出し履歴ビューに戻るには、[メソッド ビュー] ツールバー アイコンをもう一度選択します。
並列スタックを使用したスレッドとタスクのデバッグに関するビデオ チュートリアル
これらのビデオ チュートリアルでは、Visual Studio 2022 の [並列スタック] ウィンドウの [スレッド] と [タスク] ビューを使用して、マルチスレッド アプリケーションをデバッグする方法について説明します。