【问题标题】:WinDbg+SOS : How to view the .NET object wrapping the handle?WinDbg+SOS:如何查看包裹句柄的 .NET 对象?
【发布时间】:2019-06-03 12:10:01
【问题描述】:

我已将转储文件从 .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 扩展程序来分析此事件?要查看它在托管代码中的创建位置?

【问题讨论】:

    标签: .net-core windbg sos


    【解决方案1】:

    由于事件类型是自动重置,恕我直言,您应该查看 AutoResetEvent 类的实例。 不确定 Core,但在 Framework 中,您可以使用 NetExt 扩展并对堆执行查询。 AutoResetEvent 有一个私有字段 waitHandle,其中 IntPtr 指向您观察到的句柄。

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

    !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 分配跟踪或者一些特殊的断点。

    【讨论】:

      猜你喜欢
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多