.net-core - WinDbg+SOS : How to view the . NET 对象包装句柄?

标签 .net-core windbg sos

我已将 .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 类的实例。 不确定 Core,但在 Framework 中,您可以采用 NetExt 扩展并对堆执行查询。 AutoResetEvent 有一个私有(private)字段 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 分配跟踪或一些特殊的断点。

关于.net-core - WinDbg+SOS : How to view the . NET 对象包装句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56427099/

相关文章:

c++ - 查找仅在性能测试下发生的堆损坏的最佳方法是什么?

c# - WinDBG: .loadby clr 给出 "Syntax error in extension string"

visual-studio - 是否可以实现 GC.GetAliveInstancesOf<T>() (用于调试)?

clr.dll 异常导致 iis 崩溃,clr.dll 的 PDB 符号未加载,SOS 版本与您正在调试的 CLR 版本不匹配

garbage-collection - !finalizequeue 命令中显示的不同堆有哪些

angular - 如何在 Web 应用程序中预览 EML 文件?

c# - 为什么 `IDictionary` 不允许您在其界面中通过键或默认值轻松获取值?

c# - NSwag .NET Core API 版本控制配置

c# - 将 Visual Studio 2015 项目转换为 Visual Studio 2017?