アプリのUIがフリーズする特定のシナリオがあります。プロセスダンプを取得すると、UIスレッドがロックを取得して待機していることがわかります。
OS Thread Id: 0x27f4 (0)
Child SP IP Call Site
000000000027b470 0000000076de177a [GCFrame: 000000000027b470]
000000000027b5a8 0000000076de177a [GCFrame: 000000000027b5a8]
000000000027b558 0000000076de177a [HelperMethodFrame: 000000000027b558] System.Threading.Monitor.Enter(System.Object)
しかし同時に、!syncblkは、待機者だけがいて、誰もロックを保持していないことを明らかにします(MonitorHeldは2です)
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
2888 00000000200adbc8 2 0 0000000000000000 none 0000000003c167d0 System.Collections.Hashtable
私が見ている問題は、レガシーコードがハッシュテーブルのロックを取得してそれ自体を更新していることですが、誰もロックを保持していないときにどうすれば待つことができますか?
プロセスダンプは64ビットマシンで取得され、プロセスは64ビットプロセスです。私の開発ボックスも64ビットwindbgを備えた64ビットマシンです。
[更新] !mlocks(sosex拡張子)を使用すると、TCP接続であるまったく異なるロックが表示されることがわかります。