.net core WinDbg+SOS:如何查看包裹句柄的.NET对象?

.net core WinDbg+SOS:如何查看包裹句柄的.NET对象?,.net-core,windbg,sos,.net Core,Windbg,Sos,我已经将一个转储文件从.NET核心进程导入WinDbg。 有一个事件句柄 0:000> !handle 3760 f Handle 0000000000003760 Type Event Attributes 0 GrantedAccess 0x1f0003: Delete,ReadControl,WriteDac,WriteOwner,Synch QueryState,ModifyState HandleCoun

我已经将一个转储文件从.NET核心进程导入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扩展并对堆执行查询。 AutoResteEvent有一个私有字段waitHandle,它与您观察到的句柄具有IntPtr

所以,跑步之后!windex下一步查询将如下所示:

!wfrom -type System.Threading.AutoResetEvent where (waitHandle == 0000000000003760)  select $addr(), $tohexstring(waitHandle)
如果NetExt不能与Core一起工作,您可以将AutoResetEvents上的所有实例转储到文本文件中,如下图所示,然后在其中找到您的事件

.logopen c:\temp\autoresetevents.txt
.foreach (obj {!dumpheap -type AutoResetEvent -short}) {!do obj}
.logclose
使用这种方法,您将能够找到与句柄对应的托管对象。 你还可以看到根与!根。但您将无法看到它是在哪里创建的。 你需要四处搜索。 或者,您需要使用不同的方法,使用PerfView分配跟踪或一些特殊断点