5

首先,是否有用于获取每个 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

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

假设我有一个 C# 代码

MyClass MyObj;
MyObj = new MyClass();

现在如果我这样做

lock (MyObj)
{
}

syncblk所有者栏会显示“MyClass”吗?同样,当我运行此!SyncBlk命令时,它到底向我显示了什么?它是否向我显示了lock()and Monitor.Enterand Mutex() 和其他锁定机制的数量?

4

1 回答 1

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

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

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

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

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

于 2012-06-08T15:59:57.797 回答