別の(内部で開発された)C#テストインフラストラクチャを使用してテストを実行し、結果を監視およびログに記録するWPF監視アプリケーションがあります。また、商用パッケージ(InGear)を使用してPLCと通信します。その結果、アプリケーションにはたくさんのスレッドがあります(そのほとんどは私が使用しているツールによって作成されています)。
環境の性質上、ターゲット環境でデバッガーを使用することは非常に困難です。そのため、両方ともlog4netを使用して診断をログに記録しています。
外部呼び出しの周囲でtry/catchブロックを使用し、WPFレベルとAppDomainレベルの両方で未処理の例外ハンドラーをセットアップしました。
最初の長い実行中に、アプリケーションが応答しなくなったように見え、標準の「応答していません」ダイアログが表示されました。ログを見ると、すべてが停止したようです。例:ログから、DispatcherTimerがメインスレッドで1秒で応答するように設定されていることがわかります。しかし、決してしませんでした。
だから....私の質問は:
- ハングを検出するにはどうすればよいですか、またはハングしているというWindowの検出にフックしますか?UIトレッドをブロックしているのは優先度の高いスレッドである可能性があると想定していることに注意してください。そのため、おそらくWindowsメッセージに応答できません。
- タップインしたら、どのスレッドが原因であるかをどのように見つけることができますか。コールスタックをログに記録できることは大きなプラスになります。