【问题标题】:How do I see the value of a DependencyProperty in WinDbg?如何在 WinDbg 中查看 DependencyProperty 的值?
【发布时间】:2009-10-20 18:57:46
【问题描述】:

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

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

【问题讨论】:

    标签: wpf silverlight debugging dependency-properties


    【解决方案1】:

    这在很大程度上依赖于对未记录的内部结构做出假设,这些内部结构可能在其他版本中有所不同,但作为示例,这里是如何使用 .NET 4 在 WPF 中获取窗口的 Title 属性的值,记录在这里,所以我可以找到再次与 Google 合作。

    首先,找到System.Windows.Window.TitleProperty的值的地址:

    0:000> !name2ee *!System.Windows.Window ... 模块:54b81000 程序集:PresentationFramework.dll 代币:0200009c 方法表:54f06b54 EEClass: 54ba12bc !DumpClass /d 54ba12bc

    现在,获取它的GlobalIndex,它是_packedData 字段的底部16 位:

    0:000> !DumpObj /d 020e724c

    所以 228 是GlobalIndex

    现在找到窗口的地址:

    0:000> !name2ee *!Your.Window.Class.Name ... 模块:00122e9c 程序集:YourAssembly.exe 代币:020001fc MethodTable: 002a4068 !dumpheap -mt 002a4068 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 !DumpObj /d 091df92c

    哇哦。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢 - 我想我得尝试一下。看起来我已经脱离了社区知识的边缘:)
      【解决方案3】:

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

      字符串:我的窗口标题

      【讨论】:

      • 欢迎您。如果链接失效,请添加一些更精确的信息——(你认为这种情况发生得更频繁)——这在 SO 上是首选的。也许你能总结一下过程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2012-02-12
      • 2017-08-09
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多