2011-03-14 40 views
194

私はいくつかのプロジェクトで解決策を持っています。異なるプロジェクトにはいくつかのブレークポイントがあります。私は、最初のスレッドがこれらのブレークポイントの1つをヒットし、同じコードブロックに他のスレッドが入っているにもかかわらずその1つのスレッドをトレースし続けたいと考えています。Visual Studioで単一のスレッドをデバッグする方法は?

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

可能ですか?もしそうなら、どうですか?

+0

負荷の高いサーバーでデバッグしようとしているのはなぜですか? – Paolo

+5

@Paolo:このWebアプリケーションは、大規模なWebファームの心臓部として機能し、シナリオのテストではバグのある状況を模倣することは不可能です。 – Xaqron

+5

* [Visual Studioでマルチスレッドコードをデバッグするための5つのヒント](http://devpinoy.org/blogs/jakelite/archive/2009/01/10/5-tips-on-debugging-multi-threaded -code-in-visual-studio-net.aspx)*。 – noproblem

答えて

110

フリーズ/ソースレッドは、他のスレッドがコードを実行しないため、間違った方法です。

最も正しいと使用可能な方法はである:

  1. ブレークポイントウィンドウ内のヒットはCtrl + A(すべてのブレークポイントを選択します)。
  2. 右クリックして[フィルタ...]を選択します。
  3. 「ThreadId =(現在のスレッドID)」と入力します。

のVisual Studio 2015以降では、このプロセスは似ています:ブレークポイントウィンドウで

  1. ヒットはCtrl + A(すべてのブレークポイントを選択します)。
  2. 右クリックして[設定...]を選択します。
  3. ドロップダウンリストで「条件」をチェックし、「フィルタ」を選択します。
  4. 「ThreadId =(現在のスレッドID)」と入力します。

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

+1

それは正確には何であるべきではありませんが(それでもなお、ThreadIdはフィルタとして必要です)、既存のオプションで最も正しい解決策です。 – Xaqron

+21

これは、 "ステップ"デバッガコマンドが他のスレッドに入るのを防ぎますか?それは私が持っていた大きな問題でした。私は自分のスレッドを進んでいて、突然私は完全に無関係なコードの部分にいます。私はもはやVisual Studioで開発しないので、私はテストすることはできません。 –

+4

ブレークポイントウィンドウで右クリックすると「フィルタ」コマンドがありません...とにかく現在のスレッドIDをどのように見つけますか? - あなたは即時のウィンドウに行き、 'System.Threading.Thread.CurrentThread.ManagedThreadId'または何かをタイプしていますか? – BrainSlugs83

1

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

これは絶対に必要であり、あなたが解決スタットが必要な場合は、私はあなたが要求があなたのIPアドレスから来ている場合にのみ、壊れるブレークポイントを追加することができます確信しています。これを行うには、HttpContext.Request.UserHostAddressを検査する条件付きブレークポイントを追加します。ただし、これによりアプリケーションがかなり遅くなることに注意してください。ここで

+0

それは私が試みたものです。問題は、このインスタンスが同じドメイン(IPまたは別のドメインで動作している)で動作していないことで、証明書の問題(SSL、WCFなど)が多く発生し、負荷が低いとバグが発生しません。 – Xaqron

+0

申し訳ありませんが、これらのうちどれが試したかわかりません。条件付きブレークポイントを試しましたか? – steinar

+0

はい、ユニークさを保証するために管理IDに基づいて名前を付けました。それで、どのIDが割り当てられているのかを推測し、推測に基づいて条件を設定するのは難しいです。ときには推測が終わり、スレッドを捕まえるのに時間がかかることがあります。 – Xaqron

284

は、私がやったことだ:

私 が唯一の私が探していたスレッド にヒットを知っていた条件付きブレークポイントを設定し
  1. 。ブレークポイントがヒットしたら

  2. 、あなたは、Visual Studioスレッドウィンドウで、希望するスレッドである(デバッグ中、デバッグ - >ウィンドウ - >スレッド)、Ctrlキー + (すべてのスレッドを選択します) Ctrl +あなたが現在いるスレッドをクリックしてください。デバッグするスレッド以外のすべてのスレッドが選択されている必要があります。

  3. 右クリックし、[フリーズ]を選択します。今

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

+44

これは答えとしてマークする必要があります – Diego

+0

ちょうど私が必要な!ありがとうございました! – KTF

+1

私は8つのタスクが異なるスレッドで実行されている状況では、これは私のためには機能しません。私は他のすべてのスレッドを凍結し、 "ステップオーバー"しますが、IDEはしばらくフリーズしてから、別のスレッドにジャンプします。 –

1

あなたが他のすべてのスレッド(多分あなたがリクエストに答える必要実行中のアプリケーションへのVisual Studioデバッガをアタッチしている)を停止したくない場合は、作成したマクロを使用すると、自動的にブレークポイントを削除することができます。

これはan answer to Stack Overflow question "Step over" when debugging multithreaded programs in Visual Studioで提案されます。

ただし、リンクは1行ずつデバッグする方法のみを説明しています。私はあなたがそれに慣れている場合は、現在のスレッドでのみ停止するすべてのブレークポイント(例えば、与えられた行の範囲内で)を変更するようにマクロを修正することをお勧めします。

12

あなたが探しているものとまったく同じVisual Studio 2010+拡張機能をリリースしました。 それは無料です:)。

プレゼンテーション

このVisual Studioの拡張機能は、マルチスレッドアプリケーションのデバッグ中に開発者が容易に単一のスレッドに注力できるようにするために2つのショートカットやツールバーボタンが追加されます。

すべてのスレッドを凍結/解凍するために手作業でスレッドウィンドウに移動する必要性を大幅に軽減し、それに従う必要があるスレッドを凍結/解凍するので、生産性が向上します。

特長

は、現在のスレッドのみにさらに実行を制限します。他のすべてのスレッドをフリーズします。ショートカット:CTRL + T + TまたはSnowflakeボタン。 (IDに基づいて)次のシングルスレッドに切り替えます。現在のスレッドを変更し、他のすべてのスレッドをフリーズします。ショートカット:CTRL + T + Jまたは次ボ​​タン。

official pageまたはGithub repositoryに、here on the Galleryをそれをチェックアウト。

+0

使用しているVSのバージョンは? –

+0

私は拡張機能をインストールしましたが、それを動作させることはできませんでした(現在のプロジェクトではVS2010を使用しています)。 [スレッドが作成されたときにスレッドがアクティブになることが問題になると思ったのは、それがおそらく標準的な振る舞いなので、前のコメントを削除しました]。 – wil

+0

私はこれを調べるつもりです。あなたは、地球最大のデバッグ失敗のいずれかを解決しようとした唯一の人物かもしれません。 – stu

8

少し異なるアプローチ:

  1. 通常のブレークポイントを作成し、それはあなたが現在のデバッグしているマネージスレッドIDのあなたのスレッドのウィンドウに
  2. ルックを打つましょうxxxは2
  3. からスレッドIDがどこにある
  4. は、スレッドID = XXXを入力し、ブレークポイントのウィンドウとselecterフィルタであなたのブレークポイントをクリックしてください他のスレッドを止めることなくデバッグできるようになりました。

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

+1

+1。 "これは、あなたが時間を持っていると仮定します.2番目のスレッドがブレークポイントに当たる前に"。私はロックでセミコロンをラップし、セミコロンにブレークポイントを設定します。ブレークポイントが最初にヒットすると、私はブレークポイントを無効にします。ロックのために他のスレッドが入ってくることはありません。 'lock(m_someObject){; } ' – bluedog

6

ウェブアプリケーションのように複数のスレッドが生成されている場合、@MattFausの応答は機能しません。代わりに私がやったことは以下の通りです

  • 私が望む機能の中でスレッドを中断するためのブレークポイントを設定します。
  • スレッドがブレークポイントに到達して一時停止すると、ブレークポイントを削除し、F8、F10、F11を使用してデバッグを続行し、他のスレッドを実行できるようにします。ブレークポイントでのオン

+0

すべてのトップアンサーを読み終えたら、この回避策が私に役立ちました。 –

0

私は、これは彼らがブレークポイントでいくつかのことを変更したのVisual Studio 2015でわずかに異なっているが、ここでは(上)hzdbyteから受け入れ答えを適用する方法だと思います右クリック>条件>「条件式」から「フィルタ」に変更します。これにより、ThreadIdでフィルタリングすることができます。

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

関連する問題