同じコードを実行する4つのスレッドを持つアプリケーションがあります。ただし、ステップ実行すると、異なるスレッド間でジャンプします。それを1つのスレッドにロックして、他のスレッドがデバッグで無視されるようにするにはどうすればよいですか?
同じコードを実行する4つのスレッドを持つアプリケーションがあります。ただし、ステップ実行すると、異なるスレッド間でジャンプします。それを1つのスレッドにロックして、他のスレッドがデバッグで無視されるようにするにはどうすればよいですか?
回答:
はい。
[スレッド]ウィンドウ([デバッグ]-> [ウィンドウ]-> [スレッド])で、目的のスレッドを右クリックし、[スレッドに切り替える]を選択します。
また、デバッグしたくないスレッドで「フリーズ」を選択して、実行されないようにすることもできます。ただし、彼らが仕事をすることを期待しているなら、それらを「解凍」することを忘れないでください。
シングルスレッドのシングルステップは、VS 2012でほとんど修正されているようです(いくつかの注意点が以下のリンクで確認できます)。ブレークポイントは苦痛です。
以前の回答で述べたように、スレッドの凍結と解凍は通常の回避策ですが、手間がかかり、凍結された別のスレッドでスレッドが待機するとハングする可能性があります。これらは、関心のあるスレッドで自分の場所を失うことなく回復するのが難しい場合があります。
別の便利なワークフローは、ブレークポイントにスレッドフィルターを適用することです。これも回答の一部に記載されています。
ブレークポイントを作成し、ブレークポイントを右クリックして[フィルター]をクリックし、ThreadId = 7740(スレッドウィンドウのスレッドID)を入力します。
これは非常に退屈な作業です。
Microsoftへの私の提案は、明示的なブレークポイントが別のスレッドでヒットしない限り、スレッドを切り替えないようにシングルステップ(およびそのバリエーション)を修正することです。また、現在のスレッドIDをフィルターとして使用してブレークポイントを作成するためのショートカット(おそらくCtrl-F9)を追加する必要もあります。これにより、2番目のワークフローがより便利になります。
これが役立つことに同意する場合は提案に投票するか、独自の提案を追加します。
単純な場合には、より迅速な回避策があります-Steveのリンクのコメントを参照してください。
デバッガーは、ステップの発生元のスレッドでのみステップを完了します。したがって、ブレークポイントに達した場合は、それを無効にしてからステップ実行を開始し、別のスレッドで停止しないでください。アプリケーションに他のブレークポイントがあり、別のスレッドがそれにヒットした場合、説明したように混合スレッド状態でデバッグします。
したがって、私の場合、さまざまなスレッドがブレークポイントに達し始めたら、探している呼び出しが見つかるまで、Continueを数回押すだけです。次に、ブレークポイントを削除し、同じスレッドにとどまりながら、残りのコードをステップ実行します。それらの残り。
保持したいブレークポイントが複数ある場合などには、これが明らかに問題になります。ただし、単純なケースでは、これははるかに簡単です。
これは、Visual Studio 2008 SP1での非常に類似した問題に強く似ています。SP後のホットフィックスで修正されました。しかし、修正プログラムがコードベースに組み込まれなかったという他の証拠があります。このフィードバック項目も問題でした。修正プログラムが統合されないことは珍しいことではありません。
少なくとも私が見つけることができる、問題を正確に説明するフィードバック項目はありません。提出することをお勧めします。このようなバグの再現に関する通常の問題を考慮して、この問題を再現するプロジェクトと、問題の再現方法の説明を含めることを強くお勧めします。
問題には回避策があります。Debug+ Windows + Threadsに移動し、デバッグしたくないスレッドを右クリックしてFreezeを選択します。後で解凍することを忘れないでください。
これらのバグはVisual Studio 2010 Service Pack 1で再度修正されました。
私はVisual Studio Professional 2017を使用していますが、[スレッド]ウィンドウを使用してスレッドを選択的にフリーズおよびフリーズ解除します。通常、同じコードの複数のスレッドがあり、それらをフリーズしたいだけで、他のスレッドはフリーズしません。フリーズするスレッドのサブセットを選択できるので、実際には[MSスレッド]ウィンドウが好きです。スレッドを名前でグループ化し、残りのスレッドを実行させながらデバッグしているときに、同じコードを実行しているすべてのスレッドをフリーズできます。私はErwin Mayer拡張機能を使用してみましたが、うまく機能しましたが、実行しているスレッドを除くすべてのスレッドがフリーズし、デバッグがブレークポイントに達しない場合がある状況に陥ることがあります。他のスレッドが停止し、アプリケーションが停止したように見えます。一時停止ボタンを押して、スレッドウィンドウでスレッドのフリーズを解除すると、この問題が修正されます。
5.ジャンプせずに1つのスレッドをステップ実行する
どのくらいの頻度でマルチスレッドコードをデバッグしますか。最初のブレークポイントに到達してステップを実行した後、突然別のスレッドの黄色の矢印で停止しますか?予期しない動作は、ブレークポイントがまだ設定されており、その結果ヒットしたことが原因です。デフォルトでは、デバッガーはヒットするたびにブレークポイントで停止します。つまり、ステップを実行すると、すべてのスレッドの実行が許可され、現在のスレッドでステップが完了する前に、実行中のスレッドの1つがこのブレークポイントに到達します。次にこの状況になったときは、これを試してください。
- デバッガーが切り替えた新しいスレッドによってヒットされたブレークポイントを無効にするか削除します。
- 続行(F5)を押します。
- 最初のスレッドの最初の最初のステップがどのように完了し、現在アクティブなデバッグコンテキストであるかを確認します。
- ブレークポイントが削除されるか無効になるので、中断することなくその単一スレッドでステップを続行できます。