いくつかのプロジェクトで解決策があります。さまざまなプロジェクトにいくつかのブレークポイントがあります。これらのブレークポイントの1つにヒットした最初のスレッドをトレースし、他のスレッドが同じコードブロックに入るにもかかわらず、その単一スレッドのトレースを続けたいと思います。
私はこれがブレークポイントの条件、つまりスレッド名= ...またはスレッドID = ...を定義することで可能であることを知っていますが、私の場合は負荷の高い ASP.NET アプリケーションであり、 w3wp.exe
にアタッチするとすぐに、多くのスレッドがブレークポイントに到達します。 ThreadLocal<break-point>
のようなものが必要です。
出来ますか?もしそうなら、どのように?
他のスレッドはコードを実行しないため、スレッドの凍結/解凍は正しくありません。
最も正確で使用可能な方法は次のとおりです。
Visual Studio 2015以降では、プロセスは同様です:
したがって、すべてのスレッドが実行されますが、デバッガーは現在のスレッドでのみヒットします。
私がやったことは次のとおりです。
探しているスレッドにのみヒットすることがわかっている条件付きブレークポイントを設定します。
ブレークポイントに到達し、目的のスレッドに移動したら、Visual Studioの[スレッド]ウィンドウ(デバッグ中、[デバッグ]-> [ウィンドウ]-> [スレッド])で、 Ctrl + A (すべてのスレッドを選択する)、そして Ctrl +現在のスレッドをクリックします。デバッグするスレッド以外のすべてのスレッドを選択する必要があります。
これで、Visual Studioは解凍されたスレッドのみをステップスルーします。これを行うと、おそらくすべての凍結スレッドをループする必要があるため、はるかに遅いように見えますが、マルチスレッドデバッグにある程度の正気をもたらしました。
私はちょうどあなたが探しているものを正確に行うVisual Studio 2010+拡張機能をリリースしました。そして、それは無料です:)。
プレゼンテーション
このVisual Studio拡張機能は、2つのショートカットとツールバーボタンを追加して、開発者がマルチスレッドアプリケーションのデバッグ中にシングルスレッドに簡単に集中できるようにします。
スレッドウィンドウに手動で移動して、従う必要があるスレッド以外のすべてのスレッドを凍結/解凍する必要性が劇的に減少するため、生産性の向上に役立ちます。
機能
以降の実行を現在のスレッドのみに制限します。他のすべてのスレッドをフリーズします。ショートカット:CTRL + T + Tまたはスノーフレークボタン。 (IDに基づいて)次の単一スレッドに切り替えます。現在のスレッドを変更し、他のすべてのスレッドをフリーズします。ショートカット:Ctrl + T + Jまたは[次へ]ボタン。
ここのギャラリー 、 公式ページ または Githubリポジトリ をご覧ください。
Webアプリケーションのように複数のスレッドが生成されている場合、@ MattFausの回答は機能しません。私が代わりにしたことは次のとおりです
わずか私が使用した異なるアプローチ:
これは、2番目のスレッドがブレークポイントにヒットする前に上記を行う時間があることを前提としています。そうでない場合、上記を行う前に他のスレッドがブレークポイントにヒットすると、スレッドウィンドウでそれらを右クリックしてフリーズを選択できます。
線のサイドバーを右クリックして、ブレークポイント条件を設定します。 [条件]を選択し、引用符で囲んだスレッド名を使用して以下を入力します。
System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"
または、「スレッド」ウィンドウからスレッドの「管理ID」を取得し、以下を使用して同じことを実行できます。
System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id
Visual Studio 2015ではこれはわずかに異なると思います。ブレークポイントのいくつかの点を変更しましたが、受け入れた回答をhzdbyte(上記)から適用する方法は次のとおりです。
コーディングマージンのブレークポイントで、右クリック> [条件]> [条件式]から[フィルター]に変更します。これにより、ThreadIdでフィルタリングできます。
または、[ブレークポイント]ウィンドウのブレークポイントで、右クリック> [設定]> [条件]ボックスをオンにして、上記を実行します。
他のすべてのスレッドを停止したくない場合(要求に応答する必要がある実行中のアプリケーションにVisual Studioデバッガーを接続している場合など)、ブレークポイントを自動的に作成および削除するマクロを使用できます。
これは、 Stack Overflowの質問への回答Visual Studioでマルチスレッドプログラムをデバッグするときの "ステップオーバー" で提案されています。
ただし、リンクは行ごとにデバッグする方法のみを説明しています。現在のスレッドでのみ停止するようにすべてのブレークポイント(特定の行の範囲など)を変更するようにマクロを変更することをお勧めします(慣れている場合)。
同じハードウェアまたは新しいマシン(クラスタ化)上にあるライブサーバーにアプリケーションの別のインスタンスを追加し、そのインスタンスのみをデバッグすることをお勧めします。ユーザーがトリガーしているコードにブレークポイントを追加しません。それがオプションでない場合は、さらにトレースを追加します。
ただし、これが絶対に必要であり、ソリューションの統計情報が必要な場合は、リクエストがIPアドレスから送信されている場合にのみブレークするブレークポイントを追加できると確信しています。これを行うには、HttpContext.Request.UserHostAddress
を検査する条件付きブレークポイントを追加します。ただし、これによりアプリケーションの速度が大幅に低下することに注意してください。