2009-06-18 9 views
5

私は非常に深刻なマルチスレッドのデバッグの問題があります。私は、シリアルデバイスとやり取りするときにタイミング問題があり、それを追跡する必要があります。私は3つのスレッドを持っています:C#とvs2008でスレッド化されたデバッグ

  1. UIアップデートのメインスレッドです。ユーザーは、プリセットを選択することによって、デバイスの1つのパラメータを変更することも、複数のパラメータを同時に変更することもできます。
  2. デバイスがまだ接続されていることを確認するために照会するステータス検査スレッド。ユーザーがデバイスをシャットオフするか、またはデバイス自体が興味深い方法で相互作用する場合、ステータスの変更をUIに反映させる必要があります。
  3. デバイスが応答するシリアルポートを読み取るスレッド。

私の問題は、この状況をデバッグすることと実際に関係しています。デバッグするためには、各スレッドで1行に1つずつブレークポイントを設定する必要があります。あるスレッドでブレークした場合、デバッガはそのスレッドをステップ実行しません。私は他のスレッドが更新を続けることを理解していますが、デバッガで通常のように実行しているスレッド、つまりある行から次の行に移動しないでください。次に、「スレッド」タブを使用してスレッド間を切り替えることができました。

私はWPFにいると言いますが、それは状況がまったく変わるかどうかわかりません。多分それはしないかもしれません。 UIが稼動している間だけ状況をチェックする必要があるため、ステータスチェックスレッドはUIコントロールの一部です。そのコントロールはメインアプリケーションとは別のライブラリにあります。

+0

削除WPFの参照は、それが本当にWPFに関連していない原因となります。 –

+0

残念ながら、私はプロジェクトがWPFに移行以来起こったこと(他の人がソースコントロールで、異なるビルド設定を行う必要があり、これはただ一つの問題行動である)VS2008は非常に、非常にwonkily演技を始めたことに気付きました。したがって、包含の場合、ちょうどの場合。 – mmr

答えて

1

コードが奇妙な方法でシングルステップ実行されている場合は、単純なpdbファイルの破損が原因の可能性があります。あなたのコードの "すべてを再構築する"ことは、ゼロから再生成し、そのような不具合を治すでしょう。

もう1つ注意すべきことは、デバッガで1つのスレッドを停止すると、リリースビルドには見られないあらゆる種類の異常なタイミングが発生する可能性があるということです。たとえば:あなたはブレークポイントで停止している間、シリアルポートは常に(ハードウェア/ドライバレベルで)動作し続けます

  • - あなたは次のコードをステップしようとすると、それは突然巨大なバーストを受け取ることができますのデータ。非同期コールバックの場合、これは「面白い」ことがあります。

  • スレッドを1つ停止すると、通常のタイムスライシングが妨げられ、スレッドとスレッドの同期が悪くなる可能性があります。

7

デバッガがブレークポイントで停止すると、デフォルトでは他のすべてのスレッドが中断されます。しかし、ステップを実行するか、3つのスレッドがすべて再開されます。コードをステップ実行すると、デバッガは基本的に次の行に一時ブレークポイントを設定し、すべてのスレッドを再開します。もう一方の仮想ブレークポイントは、その仮想ブレークポイントがヒットする前に実行される可能性があります。

あなたがデバッグを選択したブレークポイントでたら

をデバッグしているときは、他のスレッドをフリーズすることができます| Windows |スレッド。興味のないスレッドを選択して右クリックし、フリーズを選択します。これにより、あなたが進んでいる1つのスレッドに集中することができます。

+0

しかし、私のポイントは、その一時的なブレークポイントには当たらないということです。それはちょうど一緒にblithely続けて、元のもの以外のブレークポイントを打つことはありません。私は他のスレッドを実行したい。彼らはどこに行けばいいか分かります。 – mmr

+0

ステップ実行後に手動でブレークするとどうなりますか? Win32メソッドのどこかで失われているのですか?それとも実際にコードの後のある時点で停止しますか? –

+0

それは決して止まりません。 – mmr

1

私はジェイソンと一緒にいるので、ステッピングはもう真実を示しません。

またInterlocked.Incrementを使用してカウンタをインクリメントし、(ローカルファイルが最善である)出力にカウンタを追加する方法とコードの各行を計測オフに本当に良くしています。

実際のイベントの順序がファイルへの書き込みの順序と必ずしも同じではないため、カウンタが必要です。スレッドに名前を付けるか、出力にID値を使用してください。 MS Excelを使用してファイルを開き、スレッドに応じてすべての行を色付けします。この方法で、インターリーブ操作を非常にはっきりと見ることができます。

私は、各ロックがオン/オフになるように、どの機器をロックするためのラッパーを書いています。

シンクロの問題は、私はそれをリファクタリングするのにかかるよりも多くを費やしていない助言トンシュートに恐ろしいです。時には、あなたが取っているアプローチが準最適であるという兆候です。

必要に応じてIOを使用してvolatileを使用することを忘れないでください。ただ、一般的なMTのデバッグ -