同じコードで動作する4つのスレッドを持つアプリケーションがあります。ただし、ステップを実行すると、異なるスレッド間をジャンプします。デバッグのために他のスレッドが無視されるように、あるスレッドにロックするにはどうすればよいですか?
はい。
[スレッド]ウィンドウ([デバッグ]-> [ウィンドウ]-> [スレッド])で、目的のスレッドを右クリックし、[スレッドに切り替える]を選択します。
また、スレッドを実行しないようにするために、デバッグしたくないスレッドで「フリーズ」を選択することもできます。ただし、動作を期待する場合は、それらを「解凍」することを忘れないでください。
さらに読む 。
VS 2012では、単一のスレッドを介した単一のステップ実行がほぼ修正されているようです(以下のリンクにいくつかの注意事項があります)。ブレークポイントは苦痛です。
以前の回答が述べたように、スレッドの凍結と解凍は通常の回避策ですが、それは退屈であり、スレッドが凍結されている別のスレッドで待機するとハングする可能性があります。これらは、関心のあるスレッドでの位置を失うことなく回復するのが難しい場合があります。
別の便利なワークフローは、ブレークポイントにスレッドフィルターを適用することです。これも回答の一部に記載されています。
ブレークポイントを作成し、ブレークポイントを右クリックして[フィルター]をクリックし、ThreadId = 7740(スレッドウィンドウからのスレッドID)を入力します。
これは非常に面倒です。
マイクロソフトへの私の提案は、別のスレッドで明示的なブレークポイントがヒットしない限り、スレッドを切り替えないようにシングルステップ(およびそのバリエーション)を修正することです。また、現在のスレッドIDをフィルターとして使用してブレークポイントを作成するショートカット(Ctrl-F9など)を追加する必要があります。これにより、2番目のワークフローがはるかに便利になります。
これが有用であることに同意する場合は提案に投票するか、独自の提案を追加します。
また、コードに条件付きブレークポイントを配置し、thread.Id == [someValue]
または Thread.Name == "[Somename]"
ブレークポイント条件で...
単純な場合には、はるかに迅速な回避策が存在します-Steveのリンクのコメントを参照してください。
デバッガーは、ステップが開始されたスレッドでのみステップを完了します。したがって、ブレークポイントにヒットし、それを無効にしてからステップ実行を開始する場合、別のスレッドで停止しないでください。アプリケーションに他のブレークポイントがあり、別のスレッドがヒットした場合、説明されているように、混合スレッド状態でデバッグします。
したがって、私の場合、さまざまなスレッドがブレークポイントにヒットし始めたら、探している呼び出しが見つかるまで数回続けるだけです-ブレークポイントを削除し、コードの残りをステップスルーしましたが、同じスレッドに干渉することはありませんそれらの残り。
保持したい複数のブレークポイントがある場合など、これは明らかに問題になります。しかし、単純な場合でも、これははるかに簡単です。
これは、Visual Studio 2008 SP1の非常によく似た問題に非常に似ています。 SP後のホットフィックスで修正されました。しかし、修正プログラムがコードベースに組み込まれなかったという他の証拠があります。これは フィードバック項目 も問題でした。修正プログラムが統合されないことは珍しいことではありません。
あなたの問題を正確に説明するフィードバック項目はありませんが、少なくとも私はそれを見つけることができます。提出することをお勧めします。このようなバグを再現する際の通常の問題を考えると、この問題を再現する再現プロジェクトに、問題の再現方法に関する指示を含めることを強くお勧めします。
問題の回避策があります。[デバッグ] + [Windows] + [スレッド]に進み、デバッグしないスレッドを右クリックして[フリーズ]を選択します。後でそれらを解凍することを忘れないでください。
これらのバグは、Visual Studio 2010 Service Pack 1で再び修正されました。
Visual Studio Professional 2017を使用していますが、スレッドウィンドウを使用してスレッドを選択的にフリーズおよび解凍します。通常、同じコードの複数のスレッドがあり、他のスレッドではなく、それらをフリーズしたいだけです。フリーズするスレッドのサブセットを選択できるため、実際には[MSスレッド]ウィンドウが気に入っています。スレッドを名前でグループ化し、残りのスレッドを実行させながら、デバッグ中と同じコードを実行しているスレッドをすべてフリーズできます。私はErwin Mayer拡張機能を使用してみましたが、非常にうまく機能しましたが、実行しているスレッド以外のすべてのスレッドがフリーズし、デバッグが必要なブレークポイントに到達しない場合があります他のスレッドは停止し、アプリケーションは停止したようです。一時停止ボタンを押して、スレッドウィンドウでスレッドをフリーズ解除すると、この問題が修正されます。