我的.NET
应用程序使用BlockingCollection处理从RabbitMQ接收的数据。有时在生产中它停止处理消息。我使用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
?我在文档中找不到它。
这也是找到拥有锁的线程的一种方法吗?