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 位机器和 64 位 windbg

[更新] 当我使用 !mlocks(sosex 扩展)时,我看到它显示完全不同的锁,这是一个 TCP 连接。

4

0 回答 0