Visual Studio でマルチスレッド アプリケーションをデバッグする
スレッドは、オペレーティング システムでプロセッサ時間を許可する命令のシーケンスです。 オペレーティング システムで実行されているプロセスは、いずれも 1 つ以上のスレッドで構成されます。 複数のスレッドで構成されるプロセスをマルチスレッド プロセスといいます。
複数のプロセッサ、マルチコア プロセッサ、またはハイパースレッディング プロセッサを搭載したコンピューターでは、複数の同時スレッドを実行できます。 多くのスレッドを使用する並列処理では、プログラムのパフォーマンスを大幅に向上させることができますが、多くのスレッドを追跡するため、デバッグが困難になる場合もあります。
マルチスレッドでは、新しい種類の潜在的なバグが発生する可能性があります。 たとえば、複数のスレッドが同じリソースにアクセスすることが必要になる場合がありますが、リソースに安全にアクセスできるのは一度に 1 つのスレッドだけです。 常に 1 つのスレッドだけがリソースにアクセスできるようにするには、何らかの形式の相互排他が必要になります。 相互排他が正しく実装されていないと、"デッドロック" 状態が発生し、すべてのスレッドが実行不能になる可能性があります。 多くの場合、デッドロックはデバッグするのが困難な問題です。
マルチスレッド アプリをデバッグするためのツール
Visual Studio には、マルチスレッド アプリのデバッグに使用できるさまざまなツールが用意されています。
スレッドの場合、デバッグのための主なツールは、 [スレッド] ウィンドウ、ソース ウィンドウのスレッド マーカー、 [並列スタック] ウィンドウ、 [並列ウォッチ] ウィンドウ、 [デバッグの場所] ツール バーです。 [スレッド] ウィンドウと [デバッグの場所] ツール バーの詳細については、「チュートリアル: [スレッド] ウィンドウを使用してデバッグする [並列スタック] ウィンドウと [並列ウォッチ] ウィンドウの使用方法については、「マルチ スレッド アプリケーションのデバッグの開始」を参照してください。 どちらのトピックでも、スレッド マーカーを使用する方法が示されています。
タスク並列ライブラリ (TPL) または同時実行ランタイムを使用するコードの場合、デバッグのための主要なツールは、 [並列スタック] ウィンドウ、 [並列ウォッチ] ウィンドウ、および JavaScript もサポートする [タスク] ウィンドウです。 作業を始めるときは、「チュートリアル: 並行アプリケーションのデバッグ」および「チュートリアル: C++ AMP アプリケーションのデバッグ」を参照してください。
GPU 上のスレッドのデバッグの場合の主要なツールは、 [GPU スレッド] ウィンドウです。 「方法:GPU スレッド ウィンドウを使用する」を参照してください。
プロセスの場合の主要なツールは、 [プロセスにアタッチ] ダイアログ ボックス、 [プロセス] ウィンドウ、 [デバッグの場所] ツール バーです。
Visual Studio には、強力なブレークポイントとトレースポイントも用意されており、マルチスレッド アプリケーションのデバッグに役立ちます。 個々のスレッドにブレークポイントを配置するには、ブレークポイントの条件とフィルターを使用します。 トレースポイントを使用すると、中断なしにプログラムの実行をトレースして、デッドロックなどの問題を調べることができます。 詳細については、「ブレークポイント アクションとトレースポイント」を参照してください。
ユーザー インターフェイスを含むマルチスレッド アプリケーションは、特にデバッグが困難になることがあります。 アプリケーションを別のコンピューターで実行して、リモート デバッグを使用することを検討してください。 詳細については、「リモート デバッグ」を参照してください。
マルチスレッド アプリのデバッグに関する記事
-
スレッド デバッグ機能のツアーで、 [並列スタック] ウィンドウと [並列ウォッチ] ウィンドウの機能が詳しく説明されています。
-
スレッドとプロセスをデバッグするためのツールの機能の一覧が示されています。
-
複数プロセスのデバッグ方法について説明します。
チュートリアル: [スレッド] ウィンドウを使用してデバッグする
[スレッド] ウィンドウと [デバッグの場所] ツール バーの使用方法を示すチュートリアルです。
-
[並列スタック] ウィンドウと [タスク] ウィンドウの使用方法を示すチュートリアルです。
-
デバッグ コンテキストを別のスレッドに切り替えるいくつかの方法について説明します。
-
デバッグ コンテキストを別のスレッドに切り替えるいくつかの方法について説明します。
-
デバッグ中に特に注意する必要のあるスレッドにマークまたはフラグを設定する方法について説明します。
-
パフォーマンスの高いクラスター上で実行されるアプリケーションをデバッグする方法について説明します。
-
ネイティブ スレッドのデバッグに役立つ簡単な手法について説明します。
-
[スレッド] ウィンドウに表示するスレッド名の設定方法について説明します。
-
[スレッド] ウィンドウに表示するスレッド名の設定方法について説明します。
関連するコンテンツ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示