web-dev-qa-db-ja.com

Visual Studioでシングルスレッドをデバッグする方法は?

いくつかのプロジェクトで解決策があります。さまざまなプロジェクトにいくつかのブレークポイントがあります。これらのブレークポイントの1つにヒットした最初のスレッドをトレースし、他のスレッドが同じコードブロックに入るにもかかわらず、その単一スレッドのトレースを続けたいと思います。

私はこれがブレークポイントの条件、つまりスレッド名= ...またはスレッドID = ...を定義することで可能であることを知っていますが、私の場合は負荷の高い ASP.NET アプリケーションであり、 w3wp.exeにアタッチするとすぐに、多くのスレッドがブレークポイントに到達します。 ThreadLocal<break-point>のようなものが必要です。

出来ますか?もしそうなら、どのように?

235
Xaqron

他のスレッドはコードを実行しないため、スレッドの凍結/解凍は正しくありません。

最も正確で使用可能な方法は次のとおりです。

  1. ブレークポイントウィンドウでCtrl + Aを押します(すべてのブレークポイントを選択します)。
  2. 右クリックして、「フィルター...」を選択します。
  3. 「ThreadId =(current thread id)」と入力します。

Visual Studio 2015以降では、プロセスは同様です:

  1. ブレークポイントウィンドウでCtrl + Aを押します(すべてのブレークポイントを選択します)。
  2. 右クリックして「設定...」を選択します。
  3. [条件]をオンにして、プルダウンで[フィルタ]を選択します
  4. 「ThreadId =(current thread id)」と入力します。

したがって、すべてのスレッドが実行されますが、デバッガーは現在のスレッドでのみヒットします。

142
hzdbyte

私がやったことは次のとおりです。

  1. 探しているスレッドにのみヒットすることがわかっている条件付きブレークポイントを設定します。

  2. ブレークポイントに到達し、目的のスレッドに移動したら、Visual Studioの[スレッド]ウィンドウ(デバッグ中、[デバッグ]-> [ウィンドウ]-> [スレッド])で、 Ctrl + A (すべてのスレッドを選択する)、そして Ctrl +現在のスレッドをクリックします。デバッグするスレッド以外のすべてのスレッドを選択する必要があります。

  3. 右クリックして、「フリーズ」を選択します。

これで、Visual Studioは解凍されたスレッドのみをステップスルーします。これを行うと、おそらくすべての凍結スレッドをループする必要があるため、はるかに遅いように見えますが、マルチスレッドデバッグにある程度の正気をもたらしました。

315
Matt Faus

私はちょうどあなたが探しているものを正確に行うVisual Studio 2010+拡張機能をリリースしました。そして、それは無料です:)。

プレゼンテーション

このVisual Studio拡張機能は、2つのショートカットとツールバーボタンを追加して、開発者がマルチスレッドアプリケーションのデバッグ中にシングルスレッドに簡単に集中できるようにします。

スレッドウィンドウに手動で移動して、従う必要があるスレッド以外のすべてのスレッドを凍結/解凍する必要性が劇的に減少するため、生産性の向上に役立ちます。

機能

以降の実行を現在のスレッドのみに制限します。他のすべてのスレッドをフリーズします。ショートカット:CTRL + T + Tまたはスノーフレークボタン。 (IDに基づいて)次の単一スレッドに切り替えます。現在のスレッドを変更し、他のすべてのスレッドをフリーズします。ショートカット:Ctrl + T + Jまたは[次へ]ボタン。

ここのギャラリー公式ページ または Githubリポジトリ をご覧ください。

13
Erwin Mayer

Webアプリケーションのように複数のスレッドが生成されている場合、@ MattFausの回答は機能しません。私が代わりにしたことは次のとおりです

  • ブレークポイントを設定して、目的の関数のスレッドを中断します。
  • スレッドがブレークポイントに到達して一時停止したら、ブレークポイントを削除し、F8、F10、およびF11を使用してデバッグを続行し、他のスレッドが実行できるようにします。
10
Mikaël Mayer

わずか私が使用した異なるアプローチ:

  1. 通常のブレークポイントを作成し、ヒットさせます
  2. スレッドウィンドウで、現在デバッグしているマネージスレッドIDを確認します
  3. ブレークポイントウィンドウとセレクターフィルターでブレークポイントを右クリックします。
  4. ThreadId = xxxを入力します。xxxは2のスレッドIDです
  5. 他のスレッドを停止したり、ブレークポイントにヒットしたりせずにデバッグできるようになりました

これは、2番目のスレッドがブレークポイントにヒットする前に上記を行う時間があることを前提としています。そうでない場合、上記を行う前に他のスレッドがブレークポイントにヒットすると、スレッドウィンドウでそれらを右クリックしてフリーズを選択できます。

8
Matt

線のサイドバーを右クリックして、ブレークポイント条件を設定します。 [条件]を選択し、引用符で囲んだスレッド名を使用して以下を入力します。

System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"

または、「スレッド」ウィンドウからスレッドの「管理ID」を取得し、以下を使用して同じことを実行できます。

System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id

1
James Sheridan

Visual Studio 2015ではこれはわずかに異なると思います。ブレークポイントのいくつかの点を変更しましたが、受け入れた回答をhzdbyte(上記)から適用する方法は次のとおりです。

コーディングマージンのブレークポイントで、右クリック> [条件]> [条件式]から[フィルター]に変更します。これにより、ThreadIdでフィルタリングできます。

または、[ブレークポイント]ウィンドウのブレークポイントで、右クリック> [設定]> [条件]ボックスをオンにして、上記を実行します。

1
Patelos

他のすべてのスレッドを停止したくない場合(要求に応答する必要がある実行中のアプリケーションにVisual Studioデバッガーを接続している場合など)、ブレークポイントを自動的に作成および削除するマクロを使用できます。

これは、 Stack Overflowの質問への回答Visual Studioでマルチスレッドプログラムをデバッグするときの "ステップオーバー" で提案されています。

ただし、リンクは行ごとにデバッグする方法のみを説明しています。現在のスレッドでのみ停止するようにすべてのブレークポイント(特定の行の範囲など)を変更するようにマクロを変更することをお勧めします(慣れている場合)。

1
kamaradclimber

同じハードウェアまたは新しいマシン(クラスタ化)上にあるライブサーバーにアプリケーションの別のインスタンスを追加し、そのインスタンスのみをデバッグすることをお勧めします。ユーザーがトリガーしているコードにブレークポイントを追加しません。それがオプションでない場合は、さらにトレースを追加します。

ただし、これが絶対に必要であり、ソリューションの統計情報が必要な場合は、リクエストがIPアドレスから送信されている場合にのみブレークするブレークポイントを追加できると確信しています。これを行うには、HttpContext.Request.UserHostAddressを検査する条件付きブレークポイントを追加します。ただし、これによりアプリケーションの速度が大幅に低下することに注意してください。

1
steinar