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 / d54ba12bc<---上からのEEClass値
..。
62887fec 40002f1 4cc ... ependencyProperty 0 static 020e724c TitleProperty
...^^^^^^^^プロパティオブジェクトのアドレス

次に、フィールドGlobalIndexの下位16ビットであるを取得します。_packedData

0:000>!DumpObj / d020e724c<---上からのプロパティオブジェクトアドレス
..。
62a9c190 4001377 20System.Int321インスタンス262372_packedData
... ^^^^^^&0xffff == 228

したがって、228はGlobalIndexです。

次に、ウィンドウのアドレスを見つけます。

0:000>!name2ee *!Your.Window.Class.Name
..。
モジュール:00122e9c
アセンブリ:YourAssembly.exe
トークン:020001fc
MethodTable:002a4068<---これを覚えておいてください
EEClass:00297504
名前:Your.Window.Class.Name
..。

0:000>!dumpheap -mt002a4068<---これを覚えておいてください
 アドレス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属性値名
        57bcf568 40013a7 0System.Object0インスタンス091df9c8_value
        57bd4798 40013a8 4System.Int161インスタンス228_propertyIndex
        62a9c360 40013a9 6System.Int161インスタンス27_source
..。

配列は_propertyIndexフィールドの値で並べ替えられているため(末尾の空のエントリを除く)、 228_propertyIndex == -1のエントリを見つけるのは難しくありません。_propertyIndex

最後に、対応する_valueフィールドをダンプします。

0:000>!DumpObj / d 091df9c8
..。
57bcf568 40013c0 4System.Object0インスタンス020f6228_baseValue
57bcf568 40013c1 8System.Object0インスタンス091df92c_expressionValue
57bcf568 40013c2 cSystem.Object0インスタンス00000000_animatedValue
57bcf568 40013c3 10System.Object0インスタンス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) メソッドを使用して値を取得できるはずです (これは、Dependency プロパティを持つために必要です)。それがWinDbgで機能するかどうかはわかりません。Tess Ferrandez は Dependency Properties に関するヒントを 1 つ挙げていますが、真の答えは得られません。

于 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 static 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 static 000000001102f290 UnsetValue

00000644319bc6c0 4001345 800 ...ty、WindowsBase]] 1 静的 0000000021033b88 RegisteredPropertyList

00000644784d1c28 4001346 810 ...ections.Hashtable 0 static 0000000011030aa8 PropertyFromName

00000644784cc848 4001347 5c8 System.Int32 1 static 1290 GlobalIndexCount

00000644784c5ab8 4001348 818 System.Object 0 static 00000000110407e8 同期済み

00000644784c82e8 4001349 820 System.Type 0 static 0000000011040800 NullableType

GlobalIndex: プロパティのインデックスを取得します: 262462 & 0xFFFF (Windows Calculator を使用) = 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

EEClass: 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 に答える