0

別の(内部で開発された)C#テストインフラストラクチャを使用してテストを実行し、結果を監視およびログに記録するWPF監視アプリケーションがあります。また、商用パッケージ(InGear)を使用してPLCと通信します。その結果、アプリケーションにはたくさんのスレッドがあります(そのほとんどは私が使用しているツールによって作成されています)。

環境の性質上、ターゲット環境でデバッガーを使用することは非常に困難です。そのため、両方ともlog4netを使用して診断をログに記録しています。

外部呼び出しの周囲でtry/catchブロックを使用し、WPFレベルとAppDomainレベルの両方で未処理の例外ハンドラーをセットアップしました。

最初の長い実行中に、アプリケーションが応答しなくなったように見え、標準の「応答していません」ダイアログが表示されました。ログを見ると、すべてが停止したようです。例:ログから、DispatcherTimerがメインスレッドで1秒で応答するように設定されていることがわかります。しかし、決してしませんでした。

だから....私の質問は:

  1. ハングを検出するにはどうすればよいですか、またはハングしているというWindowの検出にフックしますか?UIトレッドをブロックしているのは優先度の高いスレッドである可能性があると想定していることに注意してください。そのため、おそらくWindowsメッセージに応答できません。
  2. タップインしたら、どのスレッドが原因であるかをどのように見つけることができますか。コールスタックをログに記録できることは大きなプラスになります。
4

2 に答える 2

0

単純かもしれませんが、デバッガーをプロセスに接続し、「すべてを解除」してから、さまざまなスレッドのスタックトレースを検査するのはどうでしょうか。

于 2012-12-13T19:47:21.410 に答える
0

Windowsが検出する前に「ハング」を検出する方法を特定できなかった場合、Windowsタイムアウト例外をキャッチし、最終的にOracle.NETコンポーネントのアンマネージコードに問題を追跡することができました。

于 2013-03-29T17:20:53.467 に答える