Cra*_*rer 4 debugging silverlight wpf dependency-properties
使用 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 方法表: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
),因此不难找到带有_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,给出实际值 ... 字符串:您的窗口标题 ...
呜呼。