如何在 WinDbg 中查看 DependencyProperty 的值?

Cra*_*rer 4 debugging silverlight wpf dependency-properties

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

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

Dav*_*ner 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
方法表:002a4068 <--- 记住这一点
EEClass: 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
    EEClass: 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,给出实际值
...
字符串:您的窗口标题
...

呜呼。