首先,是否有命令为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
()和其他锁定机制的数量?
答案 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
类型一起显示。