【问题标题】:Debugging a Deadlock with !dlk command returns unkown thread name使用 !dlk 命令调试死锁返回未知线程名称
【发布时间】:2018-10-10 13:00:25
【问题描述】:

我正在尝试使用 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)。 我尝试了以下命令,以上线程均未在任何结果中列出:

  1. ~ - 应该显示所有线程(托管和非托管)
  2. ~*e!clrstack - 应该显示所有线程的调用堆栈
  3. ~*e!dumpstack - 转储所有托管线程

还有其他方法可以查看在我可能丢失的死锁中找到的线程的调用堆栈吗?我什至尝试将线程 ID 转换为十进制,但找不到匹配的线程 ID。

谢谢

【问题讨论】:

  • !threads 显示托管线程。也许你在那里找到它。但是,9A 是 154,这是一个很大的数字
  • 谢谢 - 我找到了以下文章,解释了结果中显示的线程 ID 是十进制形式的 CLR ID:blogs.msdn.microsoft.com/tess/2010/04/27/…
  • 好的,好的。然后,请将您的发现作为答案发布。然后,您可以接受自己的答案并将此案例标记为已解决。

标签: c# multithreading debugging deadlock windbg


【解决方案1】:

following article 帮助我如何阅读 !dlk 命令的结果。 根据文章,例如,如果我们在线程 0xac 中发现死锁:

CLR **thread 0xac** holds the lock on SyncBlock 00000012ac132068 OBJ:00000012830d66a0[System.Object]

!thread 命令的结果有 3 个“ID”列:

  1. 逻辑线程 ID(第一列)
  2. CLR ID(第 2 列)
  3. 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    相关资源
    最近更新 更多