如何使用WinDBG/SOS和ClrMD检查WeakReference值?

Jef*_*hao 1 windbg weak-references sos clrmd

我正在调查生产中的内存泄漏问题并检索内存转储.我试图抛弃累积物体的值,我遇到了WeakReference.这是我在WinDBG中得到的:

0:000> !do 000000011a306510 
Name:        System.WeakReference
MethodTable: 000007feeb3f9230
EEClass:     000007feeadda218
Size:        24(0x18) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007feeb3f4a00  400068d        8        System.IntPtr  1 instance         343620e0 m_handle
0:000> !do 343620e0 
<Note: this object has an invalid CLASS field>
Invalid object
Run Code Online (Sandbox Code Playgroud)

我们可以发现我们不能将该m_handle值用作对象地址.我检查了代码,WeakReference它是完全extern代码.

我的问题是,我们如何使用WinDBG/SOS检查它的价值?另外,我正在为ClrMD的问题编写ad-hoc分析器,那么我应该如何检查对象的对象引用WeakReference呢?

Tho*_*ler 5

m_handleIntPtr一个值类型,所以得到方法表IntPtr使用!name2ee *!System.IntPtr,然后做

!dumpvc <method table of IntPtr> <value of m_handle>
Run Code Online (Sandbox Code Playgroud)

这将为您提供IntPtr指向的价值.因为它指向一个对象,只需转储它

!do <value of IntPtr>
Run Code Online (Sandbox Code Playgroud)