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

Maa*_*anu 8 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] 
Run Code Online (Sandbox Code Playgroud)

wal*_*wal 22

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

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

.load D:\sosex_32\sosex.dll
Run Code Online (Sandbox Code Playgroud)

然后问题

!dlk
Run Code Online (Sandbox Code Playgroud)

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

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行]

另请参阅此链接以了解演练


Mit*_*eat 16

如何:使用Windbg调试死锁?

WinDbg/SOS备忘单

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

  • -p选项显示托管函数的参数.

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

  • -a(all)选项是-l和-pcombined的快捷方式.

  • -n选项禁用源文件名和行号的显示.如果调试器指定了SYMOPT_LOAD_LINES选项,则SOS将查找每个受管帧的符号,如果成功,将显示相应的源文件名和行号.可以指定-n(无行号)参数来禁用此行为.

SOS调试扩展不会在基于x64和IA-64的平台上显示转换帧.

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

 ~*e!clrstack 
Run Code Online (Sandbox Code Playgroud)

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