方法 : ウィンドウを使用する

[スレッド] ウィンドウでは、デバッグ中のアプリケーション内のスレッドを調べて操作できます。

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

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

  • アクティブ スレッド列。黄色の矢印によってアクティブ スレッドであることが示されます。矢印のアウトラインは、実行がデバッガーに割り込んだスレッドを示します。

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

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

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

  • [名前] 列。各スレッドの名前が表示されます (名前がある場合)。名前がない場合は、<名前がありません> と表示されます。

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

  • [優先順位] 列。システムが各スレッドに割り当てた優先度または優先順位が表示されます。

  • [関係マスク] 列。通常は非表示の高度な列です。この列には、各スレッドのプロセッサ関係マスクが表示されます。マルチプロセッサ システムでは、関係マスクによって、スレッドを実行できるプロセッサが決まります。

  • が中断カウント列では、中断カウントが含まれています。このカウントによって、スレッドを実行できるかどうかが決まります。中断カウントの詳細については、このトピックの「スレッドの凍結と凍結解除」を参照してください。

  • [プロセス名] 列。各スレッドが属するプロセスが表示されます。この列は、複数のプロセスをデバッグするときに便利ですが、通常は非表示です。

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

  • [デバッグ] メニューの [ウィンドウ] をポイントし、[スレッド] をクリックします。

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

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

アクティブ スレッドを切り替えるには

  • 次のいずれかの操作を実行します。

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

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

      新しいアクティブ スレッドの横に黄色の矢印が表示されます。矢印の灰色のアウトラインは、実行がデバッガーに割り込んだスレッドを示します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

特定のスレッドの検索

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

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

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

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

      または

    • [検索] ボックスの横にあるドロップダウン リストをクリックし、以前の検索に使用した検索文字列を選択します。

  • (省略可能) 呼び出し履歴全体を検索の対象にするには、[呼び出し履歴の検索] をクリックします。

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

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

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

マネージ コードでは、スレッドの凍結または凍結解除によって中断カウントが変わります。マネージ コードでは、凍結されたスレッドの中断カウントは 1 になります。ネイティブ コードでは、スレッドが SuspendThread 呼び出しによって中断されている場合を除き、凍結されたスレッドの中断カウントは 0 です。

[!メモ]

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

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

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

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

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

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

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

  • 左上隅にある [フラグ] ボタンを選択、 のスレッドウィンドウ。

スレッドの呼び出し履歴の表示とフレームの切り替え

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

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

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

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

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

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

参照

処理手順

チュートリアル : マルチスレッド アプリケーションのデバッグ

その他の技術情報

マルチスレッド アプリケーションのデバッグ