请解释一下!SyncBlk windbg命令

首先,是否有一个命令来获取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显示MonitorHeld保持的监视器synblk 。 写入1和读取2,但列的其余部分是什么意思?

说我有一个C#代码

 MyClass MyObj; MyObj = new MyClass(); 

现在,如果我这样做

 lock (MyObj) { } 

syncblk所有者列是否会显示“MyClass”? 同样当我运行这个!SyncBlk命令时,它究竟是什么向我展示? 它是否显示了lock()Monitor.EnterMutex ()以及其他锁定机制的数量?

要获得SOS命令的帮助,请键入!help!sos.help 。 要获得有关特定命令的帮助,请键入!help 。 SOS的帮助文本也可在线获取 。 在线版本为您提供了该命令的概述。 有关其他详细信息,请使用!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类型一起显示。