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



我已将转储文件从.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 分配跟踪或一些特殊的断点。

最新更新