4

使用 WinDbg 并尝试调试 Silverlight 应用程序的内存泄漏,我遇到了作为 DependencyProperty 实现的对象的属性 - 当我将对象转储到调试器 (WinDbg) 中时,我可以看到该属性 - 也就是说,我可以查看实际的静态字段。

如何查看房产的实际价值?

4

3 回答 3

5

这在很大程度上依赖于对未记录的内部结构做出假设,这些内部结构可能在其他版本中有所不同,但作为示例,这里是如何使用 .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),因此不难找到带有_propertyIndex228 的条目。

最后,转储相应的_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,给出实际值
...
字符串:您的窗口标题
...

呜呼。

于 2012-01-05T12:51:58.520 回答
1

您应该能够使用 DependencyObject 上的 GetValue(PropertyName) 方法获取值(这是它具有依赖属性所必需的)。不确定这是否适用于 WinDbg。Tess Ferrandez 提到了 Dependency Properties 的一个技巧,但它没有给出真正的答案。

于 2009-10-21T00:30:09.927 回答
1

如需完整的解决方案,请尝试以下分步指南: 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

字符串:我的窗口标题

于 2013-05-17T09:56:30.163 回答