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