次の方法で共有


Visual Studio デバッガーでスレッドを表示する (C#、Visual Basic、C++)

Visual Studio デバッガーの スレッド ウィンドウでは、デバッグしているアプリケーションのスレッドを調べて操作できます。 このウィンドウには、コード内のスレッドのグループ化、並べ替え、フラグ設定、凍結解除、および検索、および呼び出し履歴の表示を行う機能が用意されています。

スレッド ウィンドウは、Visual Studio デバッガーの実行中にのみ使用できます。 デバッグ セッション中に、デバッグ>Windows>Threadsを選択してウィンドウを開くことができます。

この記事では、C#、Visual Basic、または C++ プログラムの スレッド ウィンドウを操作する方法について説明します。 スレッド ウィンドウの使用方法に関する詳細なガイダンスについては、「チュートリアル: スレッド ウィンドウを使用したデバッグ」を参照してください。

スレッド ウィンドウ テーブルを調べる

スレッド ウィンドウには、各行がアプリケーション内の個別のスレッドに対応するテーブルが表示されます。 既定のビューでは、アプリケーション内のすべてのスレッドがテーブルに表示されます。 関心のあるスレッドのみを表示するようにテーブル設定を構成できます。 このテーブルには、スレッドを詳細に記述するための複数の列が用意されています。 列の配置を調整し、不要な列を非表示にすることができます。

次の表では、スレッド ウィンドウ テーブルで使用可能なすべての列について説明し、列が既定のビューで表示されるか非表示であるかを示します。 列は、左から右への既定のテーブル位置に従って一覧表示されます。

コラム 既定値 説明
フラグ 見える状態で、ラベルなし この列の赤いフラグは、スレッドが特別な注意を払ってマークされたことを示します。 フラグを選択してスレッドをマークすると、アイコンの色が赤に変わります。もう一度選択してマークを解除すると、アイコンはフラグのアウトラインに変わります。 色付きのフラグ アイコンは、マークされたスレッドとテーブル内の他のスレッドを区別するのに役立ちます。 詳細については、「フラグを設定してスレッドフラグを解除する」を参照してください。
現在のスレッド 可視でラベルが付いていない この列の黄色の矢印アイコンは、デバッガーで実行されているアプリケーションの現在のスレッドを示します。 この列の矢印アウトライン アイコンは、非現在のスレッドのデバッガー コンテキストを示します。
ID 表示 各スレッドの識別番号を提供します。
マネージド ID 表示 マネージド スレッドのマネージド ID 番号を表示します。
カテゴリ 表示 ユーザー インターフェイス スレッド、リモート プロシージャ 呼び出しハンドラー、またはワーカー スレッドとしてスレッドのカテゴリを示します。 特殊なカテゴリは、アプリケーションのメイン スレッドを識別します。
名前 表示 各スレッドを名前で識別するか、スレッドに名前が指定されていない場合は> 名前なし <。 スレッドが存在しなくなった場合、スレッドには [Thread Destroyed] というラベルが付けられます。
場所 表示 アプリケーション呼び出し履歴内でスレッドが実行されている場所を示します。 ドロップダウン矢印を選択すると、スレッドの完全な呼び出し履歴が表示されます。 スレッドが存在しなくなった場合、場所は <使用できない>とラベルが付けられます。
優先度 非表示 システムによって各スレッドに割り当てられた優先度または優先順位を表示します。
関係マスク 非表示 各スレッドのプロセッサ アフィニティ マスクを表示します。 マルチプロセッサ システムでは、アフィニティ マスクによって、スレッドを実行できるプロセッサが決まります。
中断回数 非表示 中断回数を提供します。 このカウントは、スレッドを実行できるかどうかを決定します。 詳細については、「スレッドを凍結および解凍する」を参照してください。
プロセス名 非表示 各スレッドが属するプロセスを表示します。 この列のデータは、多くのプロセスをデバッグするときに役立ちます。
プロセス ID 非表示 各スレッドが属するプロセス ID を表示します。
トランスポートの修飾子 非表示 デバッガーが接続されているコンピューターを一意に識別します。

テーブル列の表示と非表示を切り替える

[スレッド] ウィンドウのツール バーの [列] ドロップダウンに、使用可能な列の一覧が表示されます。 ドロップダウン リストを展開し、列名を選択して、テーブル内の表示を切り替えます。 表示される列は、一覧にチェックマークが付いている状態で示されます。

スレッドに特別な注意を払うフラグを設定する

フラグ アイコンを使用して、スレッドに特別な注意を払うマークを付けます。 マークされたスレッドは、スレッド ウィンドウ テーブルの赤いフラグ アイコンで示されます。 詳細については、「フラグとフラグ解除スレッドを参照してください。

フラグ付きスレッドのみを表示する

スレッド ウィンドウをフィルター処理して、フラグが設定されたスレッドのみを表示できます。 [スレッド] ウィンドウのツールバーで、[フラグ付きスレッドのみを表示] (二重フラグ アイコン) を選択します。 Ctrl + 9 キーボード ショートカットを使用することもできます。 このアクションは、フラグが設定されたスレッドがある場合にのみ使用できます。

スレッドの凍結と解凍

スレッドを固定すると、リソースが使用可能な場合でも、システムはスレッドの実行を開始しません。

ネイティブ コードでは、Windows 関数の SuspendThreadResumeThreadを呼び出すことによって、スレッドを中断または再開できます。 MFC 関数 CWinThread::SuspendThreadCWinThread::ResumeThreadを呼び出すこともできます。 SuspendThread または ResumeThread 関数を呼び出すと、スレッド ウィンドウに表示される の一時停止数 変更されます。 ネイティブ スレッドを凍結または解凍しても、中断された数は変わりません。 スレッドが解凍され、中断カウントが 0 でない限り、スレッドはネイティブ コードで実行できません。

マネージド コードでは、スレッドを凍結または解凍すると、中断されたカウントが変更されます。 マネージド コードでスレッドを固定すると、中断された数は 1 になります。 ネイティブ コードでスレッドを固定すると、SuspendThread 呼び出しを使用しない限り、中断カウントは 0 になります。

手記

ネイティブ コードからマネージド コードへの呼び出しをデバッグすると、マネージド コードは呼び出し元のネイティブ コードと同じ物理スレッドで実行されます。 ネイティブ スレッドを中断またはフリーズすると、マネージド コードもフリーズします。

選択したスレッドの実行を変更する

1 つ以上のスレッドの実行を凍結または凍結解除できます。 [スレッド] ウィンドウで、実行状態を更新するスレッドを選択します。 スレッド ウィンドウのツールバーで、[スレッドを停止] (一時停止アイコン) または [スレッドを再開] (緑の再生アイコン) を選択します。 アクションは、現在選択されているスレッドにのみ適用されます。 凍結解除アクションは、各スレッドの右クリック コンテキスト メニューでも使用できます。

現在のスレッドを変更する

スレッド ウィンドウ テーブルの黄色の矢印アイコンは、現在のスレッド (および実行ポインターの場所) を示します。 元の現在のスレッド マーカーも残ります (矢印のアウトライン アイコンと共に表示されます)。

スレッド ウィンドウ テーブルの黄色の矢印アイコンは、現在のスレッド (および実行ポインターの場所) を示します。 緑色の曲がった尾を持つ矢印アイコンは、非アクティブなスレッドに現在のデバッガーコンテキストがあることを示します。

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

デバッガーで現在のスレッドを切り替えるには、2 つの方法があります。 スレッド ウィンドウ テーブル内の任意のスレッドをダブルクリックして、現在のスレッドにします。 スレッドを右クリックし、[スレッドに切り替え] を選択することもできます。

スレッドにグループ化と並べ替えを適用する

使用可能な列と同じ条件を使用して、スレッド ウィンドウ テーブル内のスレッドをグループ化できます。 対応する列が現在のビューに表示されているかどうかに関係なく、すべての条件は常にグループ化に使用できます。 テーブルのグループ化は 1 つだけ選択できます。

スレッドをグループ化すると、各グループのテーブルに見出しが表示されます。 見出しには、グループの説明とグループ内のメンバーの数が含まれます。 名前でグループ化すると、ワーカー スレッドフラグが解除されたスレッドなどの見出しのグループが表示されることがあります。 各グループ見出しの横に展開/折りたたみ矢印アイコンが表示されます。

グループ化条件を適用すると、スレッド ウィンドウ テーブルのビューが更新され、各グループのメンバー スレッドが見出しの下に表示されます。 グループの展開/折りたたみ矢印アイコンを使用して、現在のビューのメンバーを表示または非表示にします。

スレッド ウィンドウ テーブルのスレッドに 1 つの並べ替え条件を適用することもできます。 グループ化は並べ替えよりも優先されます。 たとえば、カテゴリでスレッドをグループ化し、各カテゴリ内の ID で並べ替えることができます。

テーブル内のスレッドをグループ化する

[スレッド] ウィンドウのツール バーで、[グループ化] ドロップダウン リストを展開し、スレッドをグループ化するための条件を選択します。 [グループ] ドロップダウン リストで [なし] を選択して、適用されたグループを削除することもできます。

テーブル内のスレッドを並べ替える

スレッド ウィンドウ テーブル内のスレッドに並べ替えを適用するには、テーブルの上部にある列ヘッダー (名前のIDなど) を選択します。

列ヘッダーを選択すると、スレッド ウィンドウ テーブルのビューが更新され、選択した列の値で並べ替えられたスレッドが表示されます。 選択した列には、上下の矢印アイコンも表示されます。 上矢印アイコンは、選択した列による昇順での並べ替えを示します。 下矢印アイコンは、選択した列による降順での並べ替えを示します。 並べ替え順序を変更するには、列ヘッダーを選択します。

グループ内のスレッドを並べ替える

スレッド一覧 ウィンドウでグループ内のスレッドを並べ替えるには、最初に [グループ化] ドロップダウン リスト を使用してグループ化条件を適用します。 次に、列ヘッダーを選択して、選択した列の値でグループ化されたスレッドを並べ替えます。

すべてのグループの展開または折りたたみ

現在のビューのすべてのグループを表示または非表示にする簡単な方法があります。 [スレッド] ウィンドウのツール バーで、[グループ の展開] (プラス記号付きのダブル ボックス アイコン) または [グループの折りたたみ] (負符号付きのダブル ボックス アイコン) を選択します。

スレッドを検索する

スレッド ウィンドウ テーブル内のスレッドを検索し、表示されている任意のテーブル列で特定のコンテンツを検索できます。 検索を行うと、Visual Studio によって、検索文字列に一致する列データを含むスレッド行が表示されます。 検索では、呼び出し履歴の上部にある [場所] 列に表示されるスレッドの場所もスキャンされます。

スレッド内の特定のコンテンツを検索する

スレッドで特定のコンテンツを検索するには、いくつかの方法があります。 [スレッド] ウィンドウのツール バーで、[検索] ボックスに検索する文字列を入力し、Enter キーを押します。 検索文字列には、文字、数字、特殊文字 (< など) を指定できます。 検索が完了すると、スレッド ウィンドウでテーブルが更新され、結果が一致するスレッドが表示されます。 Visual Studio では、検索文字列に一致する特定のインスタンスが強調表示されます。 通常のスレッド ビューに戻すには、[検索] ボックスの横にある [X] アイコンを選択します。

以前に検索した文字列を検索することもできます。 検索 ドロップダウン ボックスを使用し、前の検索文字列を選択します。

完全な呼び出し履歴を検索する

既定では、完全な呼び出し履歴は検索されません。 Visual Studio では、スレッド ウィンドウ テーブルに表示されているスレッドでのみ一致が検索されます。

完全な呼び出し履歴を含めるには、[スレッド] ウィンドウ ツール バーの [検索 に呼び出し履歴を含める] (リスト 項目アイコン) を 選択します。 このオプションを有効にすると、リスト アイテム アイコンに罫線が表示されます。

呼び出し履歴を表示し、フレームを切り替える

マルチスレッド プログラムでは、各スレッドに独自の呼び出し履歴があります。 スレッド ウィンドウには、これらのスタックを表示するための便利な方法が用意されています。

ヒント

各スレッドの呼び出し履歴を視覚的に表現するには、並列スタック ウィンドウを使用します。

スレッドの呼び出し履歴を表示する

スレッド ウィンドウ テーブルで、完全なコールスタックを確認するスレッドを見つけます。 [場所 列で、スレッドの場所の左側にある展開/折りたたみ矢印を選択します。 場所が展開され、スレッドの完全な呼び出し履歴が表示されます。 位置のみを表示するには、矢印をもう一度選択します。

すべてのコールスタックを表示または折りたたむ

スレッド ウィンドウに、テーブル内のすべてのスレッドの完全な呼び出し履歴が常に表示されるかどうかを制御できます。 [スレッド] ウィンドウ のツール バーで、[呼び出し履歴 の展開] (プラス記号付きのボックス アイコン) または [呼び出し履歴の折りたたみ] (負符号付きのボックス アイコン) を 選択します。