当我发出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]
答案 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?
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)