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