使用Windbg的!clrstack命令调试死锁

时间:2010-08-21 05:26:18

标签: c# debugging deadlock windbg

当我发出clrstack命令时,我得到了以下输出。它是一个阻塞线程的callstack,它拥有一个死锁并导致死锁。这是它的确切目的吗?它是否有任何其他目的(没有任何参数)。我在哪里可以获得更多信息?

!clrstack
OS Thread Id: 0x1b2c (6956)
ESP       EIP     
0012f370 7c90e514 [HelperMethodFrame: 0012f370] System.Threading.Thread.SleepInternal(Int32)
0012f3c4 79299275 System.Threading.Thread.Sleep(Int32)
0012f3c8 00e0030f testlock.LockTest.Test()
0012f420 00e00146 testlock.Program.Main(System.String[])
0012f69c 79e71b4c [GCFrame: 0012f69c] 

3 个答案:

答案 0 :(得分:21)

使用史蒂夫约翰逊的sosex。这有一个检测死锁的命令。

从链接下载扩展程序并加载它,例如

.load D:\sosex_32\sosex.dll

然后发出

!dlk

示例输出(取自史蒂夫的网站)

  

0:010> !dlk检测到死锁:CLR线程4保持同步块00000000024c6970 OBJ:000000007fff0f80 [System.String] STRVAL = SYNC1                等待同步块00000000024c6928 OBJ:000000007fff0fa8 [System.String] STRVAL = SYNC2 CLR线程5成立   同步块00000000024c6928 OBJ:000000007fff0fa8 [System.String]   STRVAL = SYNC2                等待同步块00000000024c6970 OBJ:000000007fff0f80 [System.String] STRVAL = SYNC1 CLR线程4是   在等   ConsoleTestApp.ConsoleTestApp.MonitorDeadlockThreadProc()+ 0xa4(IL)   [C:\ dev \ ConsoleTestApp \ ConsoleTestApp.cs,第195行] CLR线程5是   在等   ConsoleTestApp.ConsoleTestApp.MonitorDeadlockThreadProc()+ 0xa4(IL)   [C:\ dev \ ConsoleTestApp \ ConsoleTestApp.cs,第195行]

另请参阅此link了解演练

答案 1 :(得分:16)

How to: Debug Deadlocks Using Windbg?

WinDbg / SOS Cheat Sheet

  

CLRStack [-a] [-l] [-p] [-n]提供   仅限托管代码的堆栈跟踪。

     
      
  • -p选项显示的参数   管理功能。

  •   
  • -l选项显示有关的信息   框架中的局部变量。 SOS   调试扩展无法检索   本地名称,所以输出为本地   名称是格式   =。

  •   
  • -a(all)选项是一个快捷方式   -l和-pcombined。

  •   
  • -n选项禁用显示   源文件名和行号。如果   调试器有选项   指定了SYMOPT_LOAD_LINES,SOS会   查找每个托管的符号   框架,如果成功将显示   相应的源文件名和   电话号码。 -n(无行号)   参数可以指定为禁用   这种行为。

  •   
     

SOS调试扩展没有   在x64和x64上显示过渡帧   基于IA-64的平台。

更新 :(感谢@Liran):要查看应用程序中所有线程的调用堆栈,请运行以下命令:

 ~*e!clrstack 

(这基本上意味着,“遍历所有线程,并在每个线程上执行'!clrstack'命令”)。

答案 2 :(得分:1)

Tess在博客上写了很多关于windbg的有用信息。这可能是一个post