使用 !dlk 命令调试死锁 returns 未知线程名称
Debugging a Deadlock with !dlk command returns unkown thread name
我正在尝试使用 SOSEX 命令 !dlk 调试进程中的死锁
我得到以下输出:
*DEADLOCK DETECTED*
CLR thread 0xac holds the lock on SyncBlock 00000012ac132068 OBJ:00000012830d66a0[System.Object]
and is waiting for the lock on SyncBlock 00000012ae4ba6b8 OBJ:00000012808391f8[System.Collections.Generic.Dictionary`2[[System.Guid, mscorlib],[CaptureServices.GenericInfrastructure.Controlling.CapManager.MO.CallRecorder.ICallRecorder, Capture Manager]]]
CLR thread 0x9a holds the lock on SyncBlock 00000012ae4ba6b8 OBJ:00000012808391f8[System.Collections.Generic.Dictionary`2[[System.Guid, mscorlib],[CaptureServices.GenericInfrastructure.Controlling.CapManager.MO.CallRecorder.ICallRecorder, Capture Manager]]]
and is waiting for the lock on SyncBlock 00000012ac132068 OBJ:00000012830d66a0[System.Object]
我希望能够获取这些线程的调用堆栈,但我无法在线程列表中找到线程 ID (0xac, 0x9a)。
我尝试了以下命令,但以上线程均未在任何结果中列出:
- ~ - 应该显示所有线程(托管和非托管)
- ~*e!clrstack - 应该显示所有线程的调用堆栈
- ~*e!dumpstack - 转储所有托管线程
有没有其他方法可以查看我可能遗漏的死锁中线程的调用堆栈?我什至尝试将线程 ID 转换为十进制,但未能找到匹配的线程 ID。
谢谢
following article
帮助我阅读 !dlk 命令的结果。
根据这篇文章,例如,如果我们在线程 0xac 中发现死锁:
CLR **thread 0xac** holds the lock on SyncBlock 00000012ac132068 OBJ:00000012830d66a0[System.Object]
!thread 命令的结果有 3 "IDs" 列:
- 逻辑线程 ID(第 1 列)
- CLR ID(第 2 列)
- OSID(第 3 列)
!dlk 中的线程 ID 实际上是 !thread 结果中的 CLR ID:
(ac) = 172。CLR id 172 是线程 177。
0:000> !threads
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
177 172 1188 00000012abfcaee0 3029220 Preemptive 0000000000000000:0000000000000000 00000012f0e94d70 3 MTA (Threadpool Worker)
现在我可以通过命令切换到线程 177: ~177s
并通过命令查看线程的调用堆栈:!clrstack
我正在尝试使用 SOSEX 命令 !dlk 调试进程中的死锁 我得到以下输出:
*DEADLOCK DETECTED*
CLR thread 0xac holds the lock on SyncBlock 00000012ac132068 OBJ:00000012830d66a0[System.Object]
and is waiting for the lock on SyncBlock 00000012ae4ba6b8 OBJ:00000012808391f8[System.Collections.Generic.Dictionary`2[[System.Guid, mscorlib],[CaptureServices.GenericInfrastructure.Controlling.CapManager.MO.CallRecorder.ICallRecorder, Capture Manager]]]
CLR thread 0x9a holds the lock on SyncBlock 00000012ae4ba6b8 OBJ:00000012808391f8[System.Collections.Generic.Dictionary`2[[System.Guid, mscorlib],[CaptureServices.GenericInfrastructure.Controlling.CapManager.MO.CallRecorder.ICallRecorder, Capture Manager]]]
and is waiting for the lock on SyncBlock 00000012ac132068 OBJ:00000012830d66a0[System.Object]
我希望能够获取这些线程的调用堆栈,但我无法在线程列表中找到线程 ID (0xac, 0x9a)。 我尝试了以下命令,但以上线程均未在任何结果中列出:
- ~ - 应该显示所有线程(托管和非托管)
- ~*e!clrstack - 应该显示所有线程的调用堆栈
- ~*e!dumpstack - 转储所有托管线程
有没有其他方法可以查看我可能遗漏的死锁中线程的调用堆栈?我什至尝试将线程 ID 转换为十进制,但未能找到匹配的线程 ID。
谢谢
following article 帮助我阅读 !dlk 命令的结果。 根据这篇文章,例如,如果我们在线程 0xac 中发现死锁:
CLR **thread 0xac** holds the lock on SyncBlock 00000012ac132068 OBJ:00000012830d66a0[System.Object]
!thread 命令的结果有 3 "IDs" 列:
- 逻辑线程 ID(第 1 列)
- CLR ID(第 2 列)
- OSID(第 3 列)
!dlk 中的线程 ID 实际上是 !thread 结果中的 CLR ID: (ac) = 172。CLR id 172 是线程 177。
0:000> !threads
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
177 172 1188 00000012abfcaee0 3029220 Preemptive 0000000000000000:0000000000000000 00000012f0e94d70 3 MTA (Threadpool Worker)
现在我可以通过命令切换到线程 177: ~177s
并通过命令查看线程的调用堆栈:!clrstack