[スレッド] ウィンドウを使用して Visual Studio デバッガーでスレッドを表示する (C#、Visual Basic、C++)

[スレッド] ウィンドウでは、デバッグ中のアプリケーション内のスレッドを調べて操作できます。 [スレッド] ウィンドウの使用方法の手順については、「チュートリアル: [スレッド] ウィンドウを使用してデバッグする」を参照してください。

スレッド ウィンドウを開く

[スレッド] ウィンドウには、各行がアプリケーションの個別のスレッドを示すテーブルが表示されます。 既定では、このテーブルにはアプリケーション内のすべてのスレッドが表示されますが、目的のスレッドのみを表示するように一覧にフィルターをかけることができます。 各列には、さまざまな種類の情報が示されます。 一部の列は非表示にすることもできます。 すべての列を表示すると、次の列が左から右に表示されます。

  • フラグ: ラベルが付いていないこの列では、特に注意する必要があるスレッドをマークできます。 スレッドにフラグを設定する方法については、「方法: スレッドに対するフラグの設定と設定解除を行う」を参照してください。

  • 現在のスレッド:ラベルの付いていないこの列で、黄色の矢印は現在のスレッドを示します。 枠線の矢印は、現在のスレッド以外のスレッドの、現在のデバッガー コンテキストを示します。

  • [ID] :各スレッドの識別番号が表示されます。

  • マネージド ID:マネージ スレッドのマネージ識別番号が表示されます。

  • カテゴリ:スレッドの分類がユーザー インターフェイス スレッド、リモート プロシージャ呼び出しハンドラー、ワーカー スレッドのいずれであるかが表示されます。 アプリケーションのメイン スレッドは特別なカテゴリによって示されます。

  • 名前: 各スレッドを名前で示します (名前がある場合)。名前がない場合は、<名前なし> と表示されます。

  • [場所] :スレッドが実行されている場所が表示されます。 この場所を展開して、スレッドの呼び出し履歴全体を表示できます。

  • [優先度] :システムが各スレッドに割り当てられている優先度または優先順位を表示する高度な列 (既定で非表示)。

  • 関係マスク: スレッドごとにプロセッサ関係マスクを示す高度な列 (既定で非表示)。 マルチプロセッサ システムでは、関係マスクによって、スレッドを実行できるプロセッサが決まります。

  • 中断カウント: 中断カウントを表示する高度な列 (既定で非表示)。 このカウントによって、スレッドを実行できるかどうかが決まります。 中断カウントの詳細については、「スレッドの凍結と凍結解除」を参照してください。

  • プロセス名: 各スレッドが所属するプロセスを表示する高度な列 (既定で非表示)。 この列のデータは、多くのプロセスをデバッグするときに役立ちます。

  • プロセス ID: 各スレッドが属するプロセス ID を表示する高度な列 (既定で非表示)。

  • トランスポートの修飾子: デバッガーが接続されているマシンを一意に識別する高度な列 (既定で非表示)。

中断モードまたは実行モードで [スレッド] ウィンドウを表示するには

  • Visual Studio がデバッグ モードの間に、 [デバッグ] メニューを選択して [ウィンドウ] をポイントし、 [スレッド] を選択します。

列の表示と非表示を切り替えるには

  • [スレッド] ウィンドウの上部にあるツールバーで、 [列] を選択します。 次に、表示または非表示にする列の名前をオンまたはオフにします。

フラグが設定されたスレッドを表示する

[スレッド] ウィンドウでスレッドをアイコンでマークすることによって、特に注目するスレッドにフラグを設定できます。 詳細については、スレッドに対するフラグの設定と設定解除を行う」を参照してください。 [スレッド] ウィンドウでは、すべてのスレッドを表示するか、フラグが設定されたスレッドのみ表示するかを選択できます。

フラグが設定されたスレッドのみ表示するには

  • [スレッド] ウィンドウの上部にあるツールバーで、 [フラグが設定されているスレッドのみを表示] を選択します (淡色表示されている場合は、最初にいくつかのスレッドにフラグを設定する必要があります)。

スレッドの凍結と凍結解除

スレッドを凍結すると、利用できるリソースがあっても、そのスレッドの実行は開始されません。

ネイティブ コードでは、スレッドを中断または再開するには、Windows 関数 SuspendThread および ResumeThread を呼び出します。 または、MFC 関数 CWinThread::SuspendThread および CWinThread::ResumeThread を呼び出します。 SuspendThread または ResumeThread を呼び出すと、 [スレッド] ウィンドウに表示されている "中断カウント" が変化します。 ネイティブ スレッドを凍結または凍結解除した場合、中断カウントは変化しません。 ネイティブ コードでは、凍結が解除され、中断カウントがゼロになるまで、スレッドを実行できません。

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

Note

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

スレッドの実行を凍結または凍結解除するには

  • [スレッド] ウィンドウの上部にあるツール バーで、 [スレッドの凍結] または [スレッドの凍結解除] を選択します。

    この操作は、 [スレッド] ウィンドウで選択されているスレッドのみに影響します。

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

黄色の矢印は、現在のスレッド (および実行ポインターの位置) を示します。 元の現在のスレッドのマーカーも、アウトラインとして残っています。

黄色の矢印は、現在のスレッド (および実行ポインターの位置) を示します。 緑色の曲線の矢印は、現在のスレッド以外のスレッドが、現在のデバッガー コンテキストを持つことを示します。

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

  • 次のいずれかの手順に従います。

    • 任意のスレッドをダブルクリックします。

    • スレッドを右クリックし、 [スレッドに切り替え] を選択します。

スレッドのグループ化と並べ替え

スレッドをグループ化すると、グループごとに、見出しがテーブルに表示されます。 見出しには、ワーカー スレッドフラグが解除されたスレッドなどのグループの説明、およびツリー コントロールが表示されます。 各グループのメンバー スレッドは、そのグループの見出しの下に表示されます。 グループのメンバー スレッドを非表示にするには、ツリー コントロールを使用して、グループを折りたたみます。

グループ化は並べ替えよりも優先されるので、たとえば、カテゴリ別にスレッドをグループ化してから、各カテゴリ内で ID によってグループを並べ替えることができます。

スレッドを並べ替えるには

  1. [スレッド] ウィンドウの上部にあるツール バーで、並べ替えの基準とする列の最上部にあるボタンを選択します。

    スレッドがその列の値で並べ替えられます。

  2. 並べ替え順序を逆にするには、同じボタンをもう一度選択します。

    一覧の一番上に表示されていたスレッドが一番下に表示されます。

スレッドをグループ化するには

  • [スレッド] ウィンドウのツール バーで、 [グループ化] リストをクリックし、スレッドのグループ化に使用する基準を選択します。

グループ内でスレッドを並べ替えるには

  1. [スレッド] ウィンドウの上部にあるツール バーで、 [グループ化] リストを選択し、スレッドのグループ化に使用する基準を選択します。

  2. [スレッド] ウィンドウで、並べ替えの基準とする列の最上部にあるボタンを選択します。

    スレッドがその列の値で並べ替えられます。

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

  • [スレッド] ウィンドウの上部にあるツール バーで、 [グループの展開] または [グループの折りたたみ] を選択します。

特定のスレッドを検索する

[スレッド] ウィンドウでは、指定した文字列に一致するスレッドを検索できます。 スレッドを検索すると、検索文字列がいずれかの列に含まれているすべてのスレッドがウィンドウに表示されます。 この情報には、 [場所] 列の呼び出し履歴の一番上に表示されるスレッドの場所が含まれます。 既定では、完全な呼び出し履歴は検索されません。

特定のスレッドを検索するには

  1. [スレッド] ウィンドウの上部にあるツール バーで、 [検索] ボックスに移動し、次のどちらかの操作を実行します。

    • 検索文字列を入力し、Enter キーを押します。

    - または -

    • [検索] ボックスの横にあるドロップダウン リストを選択し、以前の検索に使用した検索文字列を選択します。
  2. (省略可能) 呼び出し履歴全体を検索の対象にするには、 [呼び出し履歴の検索] をクリックします。

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

マルチスレッド プログラムでは、各スレッドに専用の呼び出し履歴があります。 [スレッド] ウィンドウには、これらの呼び出し履歴を表示する便利な手段が用意されています。

ヒント

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

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

  • [場所] 列で、スレッドの場所の横にある下向きの三角形を選択します。

    場所が展開されて、そのスレッドの呼び出し履歴が表示されます。

すべてのスレッドの呼び出し履歴の表示と非表示を切り替えるには

  • [スレッド] ウィンドウの上部にあるツール バーで、 [呼び出し履歴の展開] または [呼び出し履歴の折りたたみ] を選択します。