スレッドとプロセス

スレッドとプロセスは、コンピューター科学における関連概念です。 いずれも特定の順序で実行する必要がある命令のシーケンスを表します。 ただし、別個のスレッドやプロセスの命令は並列実行できます。

プロセスは、オペレーティング システム内に存在するものであり、ユーザーがプログラムやアプリケーションとして認識するものに相当します。 一方、スレッドはプロセス内に存在します。 このため、スレッドは、軽量プロセスと呼ばれることもあります。 各プロセスは、1 つ以上のスレッドで構成されます。

複数のプロセスが存在すると、コンピューターは、同時に複数のタスクを実行できます。 複数のスレッドが存在すると、プロセスで作業を分割して並列実行できます。 マルチプロセッサを搭載したコンピューターでは、プロセスやスレッドを各プロセッサに振り分けて実行できます。 これにより、真の並列処理が実現されます。

完全な並列処理は、常に実現できるとは限りません。 スレッドの同期が必要になることがあります。 スレッドは、別のスレッドが結果を生成するまで待機したり、別のスレッドが使用しているリソースに排他的にアクセスしたりすることが必要な場合があります。 同期に関する問題は、マルチスレッド アプリケーションで発生するバグの一般的な原因です。 また、スレッドは、決して利用可能にならないリソースを待機することがあります。 その結果、デッドロックと呼ばれる状態が生じることがあります。

Visual Studio デバッガーは、強力で使いやすい、スレッドとプロセスのデバッグ用ツールを提供します。

Visual Studio のスレッドおよびプロセスのデバッグ用ツール

Visual Studio でのプロセスのデバッグで使用する主要なツールは、[プロセスにアタッチ] ダイアログ ボックス、[プロセス] ウィンドウ、および [デバッグの場所] ツール バーです。 スレッドのデバッグで使用する主なツールは、[スレッド] ウィンドウ、ソース ウィンドウのスレッド マーカー、および [デバッグの場所] ツール バーです。

マルチスレッド アプリケーションのデバッグで使用する主なツールは、[並列スタック] ウィンドウと [並列タスク] ウィンドウです。

各ツールで提供される情報と実行できる操作を次の表に示します。

ユーザー インターフェイス

提供される情報

実行できる操作

[プロセスにアタッチ] ダイアログ ボックス

アタッチが可能なプロセス

  • プロセス名 (.exe)

  • プロセス ID 番号

  • メニュー バーのタイトル

  • 種類 ([マネージ v4.0]、[マネージ (v2.0、v1.1、v1.0)]、[x86]、[x64]、[IA64])

  • ユーザー名 (アカウント名)

  • セッション番号

アタッチ先のプロセスの選択。

リモート コンピューターの選択。

リモート コンピューターに接続するためのトランスポートの種類の変更。

[プロセス] ウィンドウ

アタッチされたプロセス

  • プロセス名

  • プロセス ID 番号

  • .exe を処理するパス

  • メニュー バーのタイトル

  • 状態 (中断、 実行中)

  • デバッグ (ネイティブ、マネージなど)

  • トラスポートの種類 (既定、認証なしのネイティブ)

  • トラスポートの修飾子 (リモート コンピューター)

ツールでの操作 :

  • アタッチ

  • デタッチ

  • 終了

ショートカット メニューでの操作 :

  • アタッチ

  • デタッチ

  • デバッグ停止時のデタッチ

  • 終了

[スレッド] ウィンドウ

現在のプロセス内のスレッド

  • スレッド ID

  • マネージ ID

  • カテゴリ (メイン スレッド、インターフェイス スレッド、リモート プロシージャ コール ハンドラー、またはワーカー スレッド)

  • スレッド名

  • スレッドが作成された場所

  • 優先順位

  • 関係マスク

  • 中断回数

  • プロセス名

  • フラグ インジケーター

  • 中断中のインジケーター

ツールでの操作 :

  • [検索]

  • 呼び出し履歴の検索

  • マイ コードのみにフラグを設定

  • カスタム モジュール選択にフラグを設定

  • グループ化

  • 呼び出し履歴の展開/折りたたみ

  • グループの展開/折りたたみ

  • スレッドの凍結/凍結解除

ショートカット メニューでの操作 :

  • ソースのスレッドを表示

  • スレッドに切り替え

  • 実行中のスレッドの凍結

  • 凍結されたスレッドの凍結解除

  • 注目するスレッドへのフラグの設定

  • スレッドのフラグの解除

  • スレッド名の変更

  • スレッドの表示と非表示

その他の操作 :

  • スレッドの呼び出し履歴のデータヒントでの表示

ソース ウィンドウ

左端余白のスレッド インジケーターは、スレッドが 1 つか複数かを示します (既定ではオフで、[スレッド] ウィンドウのショートカット メニューを使用してオンにすることができます)。

ショートカット メニューでの操作 :

  • スレッドに切り替え

  • 注目するスレッドへのフラグの設定

  • スレッドのフラグの解除

[デバッグの場所] ツール バー

  • 現在のプロセス

  • 現在のスレッド

  • 現在のスタック フレーム

  • 別のプロセスへの切り替え

  • 現在のプロセス内の別なスレッドへの切り替え

  • 現在のスレッド内の別なスタック フレームへの切り替え

  • 現在のスレッドに対するフラグの設定または設定解除

  • フラグが設定されたスレッドのみの表示

[並列スタック] ウィンドウ

  • 1 つのウィンドウにおける複数のスレッドの呼び出し履歴

  • 各スレッドのアクティブなスタック フレーム

  • メソッドの呼び出し元と呼び出し先

  • 指定したスレッドをフィルターで除外

  • [並列タスク] ビューへの切り替え

  • スレッドに対するフラグの設定または設定解除

  • ズーム

[並列タスク] ウィンドウ

  • タスク ID、タスクの状態 (スケジュール済み、実行中、待機中、デッドロック)、タスクに割り当てられているスレッドなど、Task オブジェクトに関する情報の表示

  • 呼び出し履歴での現在の位置

  • 作成時にタスクに渡されたデリゲート

  • 現在のタスクへの切り替え

  • タスクに対するフラグの設定または設定解除

  • タスクの凍結または凍結解除

参照

処理手順

方法 : [プロセス] ウィンドウを使用する

その他の技術情報

実行中のプロセスへのアタッチ

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