我正在尝试调试我认为是由 .net 编写的服务中的垃圾收集引起的死锁。当应用程序进入死锁时,我设法创建了一个转储文件,但我不太确定如何使用 WinDbg 确定根本原因。
加载转储时,我通过执行 !locks 开始:
0:000> !locks
CritSec +28bbecf0 at 0000019f28bbecf0
WaiterWoken No
LockCount 0
RecursionCount 1
OwningThread 3350
EntryCount 0
ContentionCount 1c
*** Locked
CritSec +43810c00 at 0000019f43810c00
WaiterWoken No
LockCount 18
RecursionCount 1
OwningThread 4bd4
EntryCount 0
ContentionCount 12
*** Locked
Scanned 32 critical sections
Run Code Online (Sandbox Code Playgroud)
查看 !threads,这是(缩写为来自 !locks 的相关线程)输出,其中一个线程似乎是垃圾收集的一部分(?):
0:000> !threads
ThreadCount: 55
UnstartedThread: 0
BackgroundThread: 12
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain …Run Code Online (Sandbox Code Playgroud)