2010-08-21 50 views
7

當我發出clrstack命令時,我得到了以下輸出。它是擁有死鎖並導致死鎖的阻塞線程的調用堆棧。這是它的確切目的嗎?它有沒有其他用途(沒有任何參數)。我在哪裏可以獲得更多信息?使用Windbg's!clrstack命令調試死鎖

!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

如下所示,此命令僅用於顯示當前線程上下文的託管調用堆棧。所以如果你正在調試死鎖問題,你應該嘗試將它與其他命令結合起來。 – 2010-08-21 09:57:01

+0

這看起來並不像我的僵局。該堆棧顯示一個睡眠呼叫。對於死鎖,您應該期望在堆棧上看到等待呼叫。 – 2010-08-25 10:12:02

回答

15

How to: Debug Deadlocks Using Windbg?

WinDbg/SOS Cheat Sheet

CLRStack [-a] [-l] [-p] [-n]提供 的僅託管代碼的堆棧跟蹤。

  • -p選項顯示 託管函數的參數。

  • -l選項顯示關於框架中局部變量的 的信息。 SOS 調試擴展無法檢索 本地名稱,所以本地 名稱的輸出格式爲 =。

  • -a(全部)選項是 -l和-pcombination的快捷方式。

  • -n選項禁用顯示 源文件名和行號。如果 調試器有選項 SYMOPT_LOAD_LINES規定,SOS將 查找符號爲每個託管 幀,如果成功會顯示 相應的源文件名和 行號。 -n(無行號) 參數可以指定爲禁止 這種行爲。

的SOS調試擴展確實 基於IA-64平臺64上不顯示 過渡幀和。

更新:(感謝@Liran):要查看所有線程調用堆棧在你的應用程序,運行以下命令:

~*e!clrstack 

(這基本上意味着,「遍歷所有的線程,並執行命令'!clrstack'在他們每一個「)。

+1

感謝您的回覆..我的申請有2個主題。但是!clrstack命令僅顯示一個線程的調用堆棧。在發佈問題之前,我已經通過了文檔.. – Maanu 2010-08-21 06:12:01

+1

@Maanu,這個命令是每個線程發出的。爲了爲你的應用程序中的所有線程發佈它,你將需要使用下面的命令:'〜* e!clrstack'(基本上意思是「遍歷所有線程並執行命令'!clrstack'在他們每個人「上)。 – Liran 2010-08-22 05:26:32

1

Tess已經有很多關於windbg的有用信息。這裏有一個post可能有幫助。

20

使用史蒂夫約翰遜的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,line 195]

另請參閱此link進行演練