我已将转储文件从.NET Core进程导入WinDbg。有一个事件句柄
0:000> !handle 3760 f
Handle 0000000000003760
Type Event
Attributes 0
GrantedAccess 0x1f0003:
Delete,ReadControl,WriteDac,WriteOwner,Synch
QueryState,ModifyState
HandleCount 2
PointerCount 65534
Name <none>
Object specific information
Event Type Auto Reset
Event is Waiting
如何使用 SOS 扩展来分析此事件?要查看它在托管代码中的创建位置?
由于事件类型是自动重置,恕我直言,您应该查看AutoResetEvent类的实例。不确定核心,但在框架中,您可以使用NetExt扩展并对堆执行查询。AutoResetEvent 有一个私有字段waitHandle
IntPtr 到您观察到的句柄。
因此,在运行 !windex NexExt 查询后,将如下所示:
!wfrom -type System.Threading.AutoResetEvent where (waitHandle == 0000000000003760) select $addr(), $tohexstring(waitHandle)
如果 NetExt 不适用于 Core,您可以将 AutoResetEvents 上的所有实例转储到文本文件中,然后在那里找到您的事件。
.logopen c:tempautoresetevents.txt
.foreach (obj {!dumpheap -type AutoResetEvent -short}) {!do obj}
.logclose
使用此方法,您将能够找到与句柄对应的托管对象。您还可以看到根!GCRoot.但是您将无法看到它的创建位置。您需要四处搜索。或者,需要使用不同的方法,使用 PerfView 分配跟踪或一些特殊的断点。