4


1

ブロックされたWindowsメッセージループのアイデアのデバッグ

私は長年のC#.NET 3.5アプリケーション「フリーズ」を持っていますが、私は困っています。 2つのC#実行可能ファイルがあります。 1つは完全なUIを備え、もう1つはトレイアプリとして実行されます。 どちらもWCFを介して、トレイで実行されている3番目のサービスアプリと通信します。

メインのWinformsアプリのUIスレッドがランダムにデッドロックします。 不思議なことに、トレイアプリを終了すると、このアプリのUIのロックが解除されます。

デバッガーをいずれかのアプリに接続するたびに、有用なことは何も学びません。 UIスレッドは、Application.Runメソッドのフリーズアプリでブロックされます。 他のすべてのスレッドはスリープ状態であるか、UIスレッドへの呼び出しでブロックされています。

また、このデッドロックが発生している間、Photoshopのような別の実行中のアプリケーションが奇妙に動作します。 トレイアプリを終了すると、これもソートされます。

私が推測できるのは、メインのWindowsレベルのメッセージポンプに問題があるということだけですが、これをさらにデバッグする方法を本当に理解していません。 フレームワークのソースコードをインストールしましたが、デッドロックされたアプリがwhileループでスタックしているのがわかります。

Application.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop

しかし、この情報で何かをするほど十分に理解していない。

さらにどこを見るべきかについて、誰かアドバイスはありますか? 私はこのランダムなデッドロックのバグを何ヶ月も追いかけてきました。

ありがとう、ニック

1 Answer


2


これはVisual Studio SDKに含まれているため、実際にはデバッグがフリーズするので、これは赤いニシンかもしれません。

いくつかの作業関連/作業関連のフリーズをデバッグする必要がありましたが、それらは非常に厄介であり、綿密な計測とコードレビューが必要です。 我慢してください!

これが私からのアドバイスです。

1)途中にいくつかの赤いニシンが表示されるので、それらにつまずかないように注意し、問題の兆候を原因自体と混同しないように注意してください。

2)このフリーズのタイミングは何ですか? それはどのくらいかかりますか? TCP接続のタイムアウトは通常23秒かかりますが、データベース接続は30秒でタイムアウトし、コマンドは120秒(設定によって異なる可能性があります)なので、かかる時間が大きな手がかりになります。 それ自体では解決せず、1つのアプリケーションを閉じて削除する必要がある場合、ほぼ確実にスレッドまたはデータベースのデッドロックです。

3)sysinternalのProcess ExplorerとProcess Monitorを使用して、何をしているか、どの時点でフリーズするかを確認します。 最後の活動は、常にではないヒントを与える可能性があります。

4)時間がかかることはわかっていますが、コードのトレースを開始し、問題の正確な場所を見つけてから、問題を見つけるのに通常数時間から数日かかります。

5)さらに情報がある場合は、別の質問を投稿してお知らせください。