2

アプリの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接続であるまったく異なるロックが表示されることがわかります。

4

0 に答える 0