使用 WinDbg 并尝试调试 Silverlight 应用程序的内存泄漏,我遇到了作为 DependencyProperty 实现的对象的属性 - 当我将对象转储到调试器 (WinDbg) 中时,我可以看到该属性 - 也就是说,我可以查看实际的静态字段。
如何查看房产的实际价值?
使用 WinDbg 并尝试调试 Silverlight 应用程序的内存泄漏,我遇到了作为 DependencyProperty 实现的对象的属性 - 当我将对象转储到调试器 (WinDbg) 中时,我可以看到该属性 - 也就是说,我可以查看实际的静态字段。
如何查看房产的实际价值?
这在很大程度上依赖于对未记录的内部结构做出假设,这些内部结构可能在其他版本中有所不同,但作为示例,这里是如何使用 .NET 4 获取 WPF 中窗口的 Title 属性的值,在此处记录,以便我可以通过 Google 找到它再次。
首先,找到 的值的地址System.Windows.Window.TitleProperty
:
0:000> !name2ee *!System.Windows.Window ... 模块:54b81000 程序集:PresentationFramework.dll 代币:0200009c 方法表:54f06b54 EEClass: 54ba12bc <--- 记住这一点 名称:System.Windows.Window ... 0:000> !DumpClass /d 54ba12bc <--- 上面的 EEClass 值 ... 62887fec 40002f1 4cc ...ependencyProperty 0 静态 020e724c TitleProperty ... ^^^^^^^^ 属性对象地址
现在,获取它的GlobalIndex
,它是该_packedData
字段的低 16 位:
0:000> !DumpObj /d 020e724c <--- 上面的属性对象地址 ... 62a9c190 4001377 20 System.Int32 1 个实例 262372 _packedData ... ^^^^^^ & 0xffff == 228
所以 228 是GlobalIndex
.
现在找到窗口的地址:
0:000> !name2ee *!Your.Window.Class.Name ... 模块:00122e9c 程序集:YourAssembly.exe 代币:020001fc MethodTable: 002a4068 <--- 记住这一点 EE类:00297504 名称:Your.Window.Class.Name ... 0:000> !dumpheap -mt 002a4068 <--- 记住这一点 地址 MT 大小 020e6b6c 002a4068 456 <--- 如果找到 >1 个对象,则必须选择正确的对象。 ...
窗口位于 020e6b6c。您要查找的值位于其_effectiveValues
数组中的某个位置:
0:000> !DumpObj /d 020e6b6c ... 6288e394 4001359 10 ...ctiveValueEntry[] 0 实例 0912e08c _effectiveValues ... ^^^^^^^^ 数组地址 0:000> !DumpArray -details 0912e08c ... [18] 0912e124 名称:System.Windows.EffectiveValueEntry 方法表:6288978c EE类:627bda2c 大小:16(0x10)字节 文件:C:\Windows\Microsoft.Net\assembly\GAC_MSIL\WindowsBase\v4.0_4.0.0.0__31bf3856ad364e35\WindowsBase.dll 领域: MT 字段偏移类型 VT Attr 值名称 57bcf568 40013a7 0 System.Object 0 实例 091df9c8 _value 57bd4798 40013a8 4 System.Int16 1 实例 228 _propertyIndex 62a9c360 40013a9 6 System.Int16 1 实例 27 _source ...
该数组按字段的值排序_propertyIndex
(除了一些以 结尾的空条目_propertyIndex == -1
),因此不难找到带有_propertyIndex
228 的条目。
最后,转储相应的_value
字段:
0:000> !DumpObj /d 091df9c8 ... 57bcf568 40013c0 4 System.Object 0 实例 020f6228 _baseValue 57bcf568 40013c1 8 System.Object 0 实例 091df92c _expressionValue 57bcf568 40013c2 c System.Object 0 实例 00000000 _animatedValue 57bcf568 40013c3 10 System.Object 0 实例 00000000 _coercedValue ... 0:000> !DumpObj /d 020f6228 <--- 从_baseValue,给出绑定表达式 ... 名称:System.Windows.Data.BindingExpression ... 0:000> !DumpObj /d 091df92c <--- 从_expressionValue,给出实际值 ... 字符串:您的窗口标题 ...
呜呼。
您应该能够使用 DependencyObject 上的 GetValue(PropertyName) 方法获取值(这是它具有依赖属性所必需的)。不确定这是否适用于 WinDbg。Tess Ferrandez 提到了 Dependency Properties 的一个技巧,但它没有给出真正的答案。
如需完整的解决方案,请尝试以下分步指南: http: //georgelache.blogspot.ro/2012/04/steps-to-get-value-of-dependency.html
该示例涵盖了获取窗口标题的情况
!CLRStack -a
..
0000000000129270 000006442d6acf50 System.Windows.Window.InternalClose(布尔值,布尔值)
PARAMETERS:
this (0x0000000000129360) = 0x0000000011b59968
shutdown = <no data>
ignoreCancel = <no data>
LOCALS:
<no data>
<no data>
<no data>
...
0:000> !do 0x0000000011b59968
名称:GFW.Controls.View.ShellWindow MethodTable:00000644805228b8 EEClass:0000064480516240 大小:832(0x340)字节...
00000644319b3708 40002d3 998 ...ependencyProperty 0 静态00000000115de6d8 TitleProperty 00000644319be898 4001323 20 ...ctiveValueEntry[] 0 实例00000000154ff638 _effectiveValues ...
0:000> !do /d 00000000115de6d8
名称:System.Windows.DependencyProperty
方法表:00000644319b3708
EE类:0000064431857550
大小:88(0x58)字节
文件:C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\WindowsBase\v4.0_4.0.0.0__31bf3856ad364e35\WindowsBase.dll
领域:
MT Field Offset Type VT Attr Value Name
00000644784c6960 400133c 8 System.String 0 实例 00000000111f6450 _name
00000644784c82e8 400133d 10 System.Type 0 实例 0000000011024538 _propertyType
00000644784c82e8 400133e 18 System.Type 0 实例 0000000011255ea8 _ownerType
00000644319b12a8 400133f 20 ....PropertyMetadata 0 实例 00000000115de678 _defaultMetadata
00000644319b1088 4001340 28 ...dateValueCallback 0 实例 00000000115de638 _validateValueCallback
00000644319be750 4001341 30 ...ndencyPropertyKey 0 实例 0000000000000000 _readOnlyKey
0000064431c147f8 4001342 40 System.Int32 1 个实例 262462 _packedData
00000644319be408 4001343 48 ....InsertionSortMap 1 个实例 00000000115de720 _metadataMap
00000644319b0fc8 4001344 38 ...erceValueCallback 0 实例 0000000000000000 _designerCoerceValueCallback
00000644784c5ab8 400133b 808 System.Object 0 静态 000000001102f290 UnsetValue
00000644319bc6c0 4001345 800 ...ty,WindowsBase]] 1 静态 0000000021033b88 RegisteredPropertyList
00000644784d1c28 4001346 810 ...ections.Hashtable 0 静态 0000000011030aa8 PropertyFromName
00000644784cc848 4001347 5c8 System.Int32 1 静态 1290 GlobalIndexCount
00000644784c5ab8 4001348 818 System.Object 0 静态 00000000110407e8 同步
00000644784c82e8 4001349 820 System.Type 0 静态 0000000011040800 NullableType
GlobalIndex:获取属性的索引:262462 & 0xFFFF(使用 Windows 计算器)= 318
!DumpArray -详细信息00000000154ff638
[31] 00000000154ff838
Name: System.Windows.EffectiveValueEntry
MethodTable: 00000644319b6120
EEClass: 0000064431858c90
Size: 32(0x20) bytes
File: C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\WindowsBase\v4.0_4.0.0.0__31bf3856ad364e35\WindowsBase.dll
Fields:
MT Field Offset Type VT Attr Value Name
00000644784c5ab8 400136e 0 System.Object 0 instance 0000000041dd7b88 _value
00000644784d0930 400136f 8 System.Int16 1 instance 318 _propertyIndex
0000064431c149b0 4001370 a System.Int16 1 instance 11 _source
0:000> !do /d 0000000041dd7b88
名称:System.String
方法表:00000644784c6960
EE类:000006447804eec8
大小:108(0x6c)字节
文件:C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
字符串:我的窗口标题