! syncblk определяет ожидающие потоки - PullRequest
1 голос
/ 22 августа 2010

Когда я запустил команду! Syncblk в заблокированном приложении из windbg, я получил следующий вывод.Он показывает, какой поток удерживает блокировку.Но это не указывает, какие потоки ожидают блокировки.Как я могу определить темы, которые ожидают?,

0:004> !syncblk 
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 
2      0016d12c  3           1        0014b1c0 1ab8 0    01292e3c System.Object 
----------------------------- 
Total 2 
CCW 0 
RCW 0 
ComClassFactory 0 
Free 0 

Ответы [ 2 ]

2 голосов
/ 22 августа 2010

Вы можете просмотреть все управляемые стеки, используя ~*e!clrstack. Если поток ожидает получения блокировки, вы должны увидеть некоторые соответствующие кадры в его стеке (например, Monitor.TryEnter).

1 голос
/ 30 сентября 2010

Если вы устраняете проблему взаимоблокировки, первое, что вы должны сделать, это загрузить SOSEX.dll и попробовать команду !dlk, поскольку она будет определять взаимоблокировки на основе Monitor и ReaderWriteLock,Он даже точно определит точное место в исходном коде.

В некоторых случаях команда !dlk не определяет взаимоблокировки, как ожидалось.В этом случае вам нужно использовать !syncblock в соответствии с вашим вопросом.Чтобы найти, какой поток пытается получить определенную блокировку, вы можете использовать ~*e!clrstack, как указывает @Liran.Однако вы также можете использовать ~*e!dso (который будет сбрасывать ссылки в стеке для разных потоков) и искать ссылки на объект блокировки.

...