我已将 .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/