请解释一下!SyncBlk的windbg命令

bso*_*aid 5 c# command windbg sos

首先,是否有一个获取每个sos命令的帮助和参数的命令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
Run Code Online (Sandbox Code Playgroud)

MonitorHeld显示由持有的监视器#synblk.写入1和读取2,但列的其余部分是什么意思?

说我有一个C#代码

MyClass MyObj;
MyObj = new MyClass();
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做

lock (MyObj)
{
}
Run Code Online (Sandbox Code Playgroud)

请问syncblk所有者列秀"MyClass的"?同样,当我运行此!SyncBlk命令时,它到底显示了什么?它是否显示了lock()and Monitor.EnterMutex()以及其他锁定机制的数量?

Bri*_*sen 7

要获得SOS命令的帮助,请输入!help!sos.help.获取特定命令类型的帮助!help <command>.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
Run Code Online (Sandbox Code Playgroud)

1)第一个值是线程对象,第二个是本机线程id,最后一个是WinDbg线程id.

2)第一个值是用于锁定的对象,第二个值是该对象的类型.

!syncblk仅涵盖内部.NET锁,因此Mutex(这是一个内核对象)不在此处.

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