【发布时间】:2009-10-20 18:57:46
【问题描述】:
使用 WinDbg 并尝试调试 Silverlight 应用程序的内存泄漏时,我遇到了作为 DependencyProperty 实现的对象的属性 - 当我将对象转储到调试器 (WinDbg) 中时,我可以看到该属性 - 即,我可以看到实际的静态字段。
如何查看房产的实际价值?
【问题讨论】:
标签: wpf silverlight debugging dependency-properties
使用 WinDbg 并尝试调试 Silverlight 应用程序的内存泄漏时,我遇到了作为 DependencyProperty 实现的对象的属性 - 当我将对象转储到调试器 (WinDbg) 中时,我可以看到该属性 - 即,我可以看到实际的静态字段。
如何查看房产的实际价值?
【问题讨论】:
标签: wpf silverlight debugging dependency-properties
这在很大程度上依赖于对未记录的内部结构做出假设,这些内部结构可能在其他版本中有所不同,但作为示例,这里是如何使用 .NET 4 在 WPF 中获取窗口的 Title 属性的值,记录在这里,所以我可以找到再次与 Google 合作。
首先,找到System.Windows.Window.TitleProperty的值的地址:
现在,获取它的GlobalIndex,它是_packedData 字段的底部16 位:
所以 228 是GlobalIndex。
现在找到窗口的地址:
0:000> !name2ee *!Your.Window.Class.Name ... 模块:00122e9c 程序集:YourAssembly.exe 代币:020001fc MethodTable: 002a4068 !dumpheap -mt 002a4068 1 个对象,则必须选择正确的对象。 ...窗口位于 020e6b6c。您要查找的值在其 _effectiveValues 数组中的某个位置:
数组按_propertyIndex字段的值排序(除了一些以_propertyIndex == -1结尾的空条目),因此不难找到带有_propertyIndex 228的条目。
最后转储对应的_value字段:
哇哦。
【讨论】:
您应该能够使用 DependencyObject 上的 GetValue(PropertyName) 方法获取值(这是它具有依赖属性所必需的)。不确定这是否适用于 WinDbg。 Tess Ferrandez mentions one tip with Dependency Properties 但它没有给出真正的答案。
【讨论】:
要获得完整的解决方案,请尝试以下分步指南:http://georgelache.blogspot.ro/2012/04/steps-to-get-value-of-dependency.html
例子涵盖了获取窗口标题的情况
!CLRStack -a
..
0000000000129270 000006442d6acf50 System.Windows.Window.InternalClose(Boolean, Boolean)
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 方法表:00000644805228b8 EE类: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
EEClass: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 未设置值
00000644319bc6c0 4001345 800 ...ty, WindowsBase]] 1 static 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 -details 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
EEClass:000006447804eec8
大小:108(0x6c) 字节
文件:C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
字符串:我的窗口标题
【讨论】: