WinDbg を使用して、Silverlight アプリケーションのメモリ リークをデバッグしようとすると、DependencyProperty として実装されているオブジェクトのプロパティに遭遇します。デバッガ (WinDbg) でオブジェクトをダンプすると、プロパティが表示されます。実際の静的フィールドを参照してください。
不動産の実際の価値をどのように見ることができますか?
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 / 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から、実際の値を示します ..。 文字列:あなたのウィンドウタイトル ..。
ウーフー。
DependencyObject で GetValue(PropertyName) メソッドを使用して値を取得できるはずです (これは、Dependency プロパティを持つために必要です)。それがWinDbgで機能するかどうかはわかりません。Tess Ferrandez は Dependency Properties に関するヒントを 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
文字列: 私のウィンドウのタイトル