My .NET
приложение использует BlockingCollection для обработки данных, полученных от RabbitMQ.Иногда на производстве прекращается обработка сообщений.Я сделал dump, используя procdump
util, и попытался проверить дамп, используя WinDbg
.Команда !threads
показывает мне один поток с LockCount=1
.Команда ~*e!clrstack
выдала мне этот вывод для другого потока:
Child SP IP Call Site
0f3bf068 7760c8ac [GCFrame: 0f3bf068]
0f3bf118 7760c8ac [HelperMethodFrame_1OBJ: 0f3bf118] System.Threading.Monitor.ObjWait(Boolean, Int32, System.Object)
0f3bf1a4 70ac5fb7 System.Threading.Monitor.Wait(System.Object, Int32, Boolean)
0f3bf1b4 70ad76a7 System.Threading.SemaphoreSlim.WaitUntilCountOrTimeout(Int32, UInt32, System.Threading.CancellationToken)
0f3bf1d0 70ad75f0 System.Threading.SemaphoreSlim.Wait(Int32, System.Threading.CancellationToken)
0f3bf230 703dc110 System.Collections.Concurrent.BlockingCollection`1[[System.__Canon, mscorlib]].TryAddWithNoTimeValidation(System.__Canon, Int32, System.Threading.CancellationToken)
Я попытался найти больше информации о блокировках.!locks
команда дала мне только это Scanned 40 critical sections
.!SyncBlock
показывает это:
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
-----------------------------
Total 1364
CCW 1
RCW 1
ComClassFactory 0
Free 713
Что такое GCFrame
?Что такое CCW
и RCW
?Я не могу найти его в документации.
Также есть ли способ найти нить, которой принадлежит блокировка?