请解释一下!SyncBlk的windbg命令

时间:2012-06-08 15:22:20

标签: c# command windbg sos

首先,是否有命令为windbg中的每个sos命令获取帮助和参数?

其次,我想了解!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.Enter以及Mutex()和其他锁定机制的数量?

1 个答案:

答案 0 :(得分: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(这是一个内核对象)。

在您的示例中,运行lock语句的代码的线程ID将与地址MyObj指向的地址和MyClass类型一起显示。