2009-03-31 13 views
0

バックグラウンドスレッドで実行され、Dispatcher.BeginInvoke()を使用して処理が完了したときにUIスレッドのImageコントロールを更新する画像処理コードがあります。アプリケーションをデバッガの外で実行していると、かなり頻繁にクラッシュします。私がデバッガでそれを実行するとすぐに、私はそれがまったく起こることができません。どうやらタイミング差は私の人生を悲惨なものにするのに十分である;-)デバッグ中には発生しない例外をキャッチする方法はありますか?

私は、関連すると思われるコードの周りにtry/catchブロックを置いてみたが、何らかのエラー私の前を滑り続け、どこを見るか分からない。

私は、デバッガの例外捕捉動作を例外がスローされるたびに破棄するように設定したいと考えていましたが、デバッグ中に例外が発生することができないため、投げ。

私はクラッシュしたプロセスにアタッチすることができます(画面上にあるので、完全に反応しません)、デバッガを一時停止して、各スレッドがコード内のどこにあるかを確認しますが、どのような例外がスローされているのか

進め方についてのご意見はありますか?

編集:

  1. 私が考えることができるように私はできるだけ多くの場所でDBGVIEWでSystem.Diagnostics.Trace.WriteLine()を使用してきました。私はそれが例外が発生していると思われる場所を追跡することができますが、私は見つけることができません何が重要であるかは、です。
  2. メモリリークを追跡するのにWinDBG + SOSを使用しましたが、見つけにくい例外を追跡しませんでした。誰もがこの容量でWinDBG + SOSを使うためのリソースを提案できますか?
+0

デバッガを接続せずに、デバッグまたはリリースビルド(設定)でクラッシュしますか? – RobS

+0

アクティブなデバッガを使用する前に、どのようにソフトウェアをデバッグしましたか?最近の子供たちは、このような状況でデバッガレスデバッグを学ぶべきです。 – Welbog

+0

WinDBG + SOSはいかがですか?これらのツールを使用して例外を見つけることができます。 –

答えて

1

キャッチしたことがない場合、どのように例外が発生するのでしょうか?

また、場所全体にtry/catchブロックを配置するのではなく、境界に、特にスレッドの境界に配置します。任意のThreadStartメソッドや、BeginInvokeやコールバックメソッドなどで呼び出されるその他のコードの周りに置くことができます。

+0

これは良い質問です... –

+0

私の画像処理コードでデッドロックになっていました。提案してくれてありがとう、私はそれがそうでなければ未処理の例外だと思ってもっと多くの時間を費やしただろう! –

-1

アプリケーションの開始時に呼び出される静的なメインにtry/catchを1つ入れますか?したがって、アプリケーションがクラッシュしたときにスタックトレースと例外情報をどこかに出力できます。

+0

いいえ、マルチスレッドアプリケーションです。 –

2

ほんの少しの例外を除いて、BeginInvokeには対応するEndInvokeの対応があるはずです(more details whyについては、1つの例外はControl.BeginInvokeです)。

紛失EndInvokeは、メインスレッドによって例外がキャッチされず、アプリケーションが終了する理由があります。あなたは、デリゲートの実行中にスローされた例外をキャッチするためにDispatcher.UnhandledExceptionイベントを処理する必要があります(EndInvokeを実装していません)Dispatcherを扱っているあなたの特別な場合であるため

ところで、System.Diagnostics.Traceメッセージを監視するための良いツールは、SysinternalsのDbgViewです。

+0

DbgViewに非常に精通していますが、BeginInvokeを呼び出すたびに、対応するEndInvoke呼び出しは必要ありません。 Dispatcherのドキュメントを参照してください。EndInvokeメソッドはありません。 –

+0

あなたはControl.EndInvokeの権利があるようですが、一般的にEndInvokeを呼び出すことは、リソースを漏らさず、適切な例外処理を行うために必要です。私の答えの更新を参照してください。 –

+0

右 - 指定する必要があります、私はCanvas.Dispatcherを使用しています。私はDispatcher.UnhandledExceptionを認識していませんでしたが、私はそれを調べます、ありがとう! –

関連する問題