2

デッドロックが原因でハングした .Net プロセスのダンプを取得しました (GUI スレッドが応答しなくなり、ログにはいくつかのスレッドが応答を停止したことが示されています)。私はスナップショットを撮り、現在windbgでそれを調べています.1つを除くすべてのスレッドが最後のものを待っています. その 1 つのスレッドのスタック トレースを !clrstack -p で見ると、ReaderWriterLock への書き込みを取得しようとしていることがわかります。

デッドロックがどのように発生したかを理解できるように、他のどのスレッドがそのロックを保持しているかを知るにはどうすればよいですか?

ありがとう

[編集] .Net1.1 の sos.dll にはこれを支援するコマンド !rwlocks があったようですが、.Net2.0 バージョンにはありません。狩りは続く

4

5 に答える 5

1

しばらく前に同様のトピックをここに投稿しました。C#を使用すると、ファイルにロックが保持されているかどうかをテストできます。

いくつかの記事などを参照しましたが、ウェイトチェーントラバーシアル(WCT)が役立ちます。やや扱い​​にくいですが、このmsdn magバグレイヤーの記事では、管理されたコンテキストでwindbgでWCTを使用する方法を示しています。

于 2009-05-19T20:05:09.220 に答える
1

sosexと !dlk を試す

于 2008-12-10T22:03:55.367 に答える
1

確実ではありませんが、!SyncBlk を使用して同期ブロック オブジェクトを確認できる可能性があります。引数を指定せずに呼び出すと、スレッドが所有する同期ブロックが表示されるはずです。

同期ブロックのデッドロックがある場合は、拡張子SOSEXが必要な場合があります。この拡張機能は、どのスレッドがどのロックを待機しているかを示すコマンド !dlk を提供します。これは同期ブロックに対してのみ機能しますが、他の同期オブジェクトのデッドロックは検出されません。lock() (Monitor.Enter) を使用している場合、これは問題になりません。

于 2008-11-25T18:40:04.770 に答える
0

これまでのところ、最善の方法は、すべてのスレッド スタックの !dso を見て、どのスレッドがロックを参照しているかを確認することです。その後の簡単なチェックにより、どのスレッドがロックを保持しているかを突き止めることができます。本当にきれいで迅速な方法ではありませんが...

于 2008-11-26T11:48:04.787 に答える
0

トレーサビリティを提供するアプローチは、ロックを IDisposable インターフェイスにラップし、次のものを置き換えることです。

lock( マイロック) { ... }

using( new DisposeableLock() ) { ... }

コンストラクターと Dispose() メソッドをコンソール、log4net、またはその他のメカニズムに記録できます。これにより、何がロックされ、何がブロックされているかを確認できます。

于 2008-11-27T02:48:55.810 に答える