我有一个特殊情况,我的应用程序 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 位机器和 64 位 windbg
[更新] 当我使用 !mlocks(sosex 扩展)时,我看到它显示完全不同的锁,这是一个 TCP 连接。