2012-06-08 123 views
5

首先,是否有一個命令獲得幫助和參數爲每個sos命令windbg請解釋!SyncBlk windbg命令

其次,我想了解!syncblk輸出

Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 
    201 05b9493c   979   1 05bc1040 bcc 45 022f3490 System.Collections.ArrayList 
2875 05b4c914   1   1 17b99e10 1af8 290 024862d8 MyClass 
2945 05b4b66c   1   1 17d1a290 12c0 752 02482940 MyClass 

MonitorHeld顯示了synblk舉行監視器#。 1表示寫入,2表示讀取,但列的其餘部分意味着什麼?

說我有一個C#代碼

MyClass MyObj; 
MyObj = new MyClass(); 

現在,如果我做

lock (MyObj) 
{ 
} 

請問syncblk所有者列秀 「MyClass的」? 同樣,當我運行這個!SyncBlk命令時,它究竟向我展示了什麼?它是否顯示lock()Monitor.EnterMutex()以及其他鎖定機制的編號?

回答

7

要獲得有關SOS命令類型!help!sos.help的幫助。要獲得有關特定命令的幫助,請鍵入!help <command>。 SOS的幫助文本也是available online。在線版本爲您提供了該命令的概述。有關其他詳細信息,請使用!help syncblk

!syncblk的輸出顯示了線程ID(下面輸出中的頭文件#1),用於鎖定的對象和對象的類型(頭文件#2)。

         +-------#1-------+ +-----#2------+ 
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 
    201 05b9493c   979   1 05bc1040 bcc 45 022f3490 System.Collections.ArrayList 
2875 05b4c914   1   1 17b99e10 1af8 290 024862d8 MyClass 
2945 05b4b66c   1   1 17d1a290 12c0 752 02482940 MyClass 

1)第一個值是線程對象,第二個是本地線程ID,最後一個是WinDbg線程ID。

2)第一個值是用於鎖定的對象,第二個值是此對象的類型。

!syncblk只涵蓋內部的.NET鎖,所以Mutex(這是一個內核對象)沒有在這裏介紹。

在您的示例中,運行鎖定語句的代碼的線程ID將與地址MyObj指向以及類型MyClass一起顯示。

+0

你能告訴哪一欄顯示哪個值嗎?有2個同步塊列。 – bsobaid

+0

我已經更新了我的答案以澄清。請讓我知道,如果它仍然不清楚。 –

+0

謝謝,第1,2和4列是什麼意思? WinDbgId用於鑽取一個線程?像〜45e!clrstack的東西?有一種方法可以知道給定的同步塊行持有/等待某個線程的代碼行嗎? – bsobaid