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

WinDbg+SOS : How to view the .NET object wrapping the handle?

我已经将转储文件从 .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 的实例 class。 不确定核心,但在框架中,您可以使用 NetExt 扩展并对堆执行查询。 AutoResetEvent 有一个私有字段 waitHandle,其中 IntPtr 指向您观察到的句柄。

因此,在 运行 !windex NexExt 查询之后将如下所示:

!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

通过这种方法,您将能够找到与句柄对应的托管对象。 您还可以使用 !GCRoot 查看根。但是您将无法看到它的创建位置。 你需要四处寻找。 或者您需要使用不同的方法,使用 PerfView 分配跟踪或一些特殊的断点。