2012-06-08 80 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