Windbg调试WPF的依赖属性

??

我们用wndbg调试时,很多时候需要查看某个控件的依赖属性值。

比如:我们查看DataGridColumnHeader的Content依赖属性 
 

1.我们用到的windbg的命令有:!do, !da -details, .formats 

2.利用!do查看依赖对象的成员变量, 找到具体依赖属性的地址

0:000> !do 00000000039a71d8

Name:        System.Windows.Controls.Primitives.DataGridColumnHeader

MethodTable: 000007fee7e58090

EEClass:     000007fee7885bd8

Size:        384(0x180) bytes

File:        C:\Windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework\v4.0_4.0.0.0__31bf3856ad364e35\PresentationFramework.dll

Fields:

MT    Field   Offset                 Type VT     Attr            Value Name

000007fef3f2eb00  4000db0        8 ...eading.Dispatcher  0 instance 0000000002dd4e68 _dispatcher

000007fef3f3bb88  4001321       10 ...endencyObjectType  0 instance 000000000308a530 _dType

000007fef7825ac8  4001322       18        System.Object  0 instance 0000000000000000 _contextStorage

000007fef3f3e898  4001323       20 ...ctiveValueEntry[]  0 instance 00000000042efb08 _effectiveValues

000007fef7847b70  4001324       28        System.UInt32  1 instance          3680277 _packedData

000007fef3f33708  400131f      7c0 ...ependencyProperty  0   static 0000000002dd5ef0 DirectDependencyProperty

---------------------省略部分----

000007fef3f33708  40002ca      950 ...ependencyProperty  0   static 0000000002dfd820 ContentProperty

0000000000000000  40002cb      958                       0   static 0000000002dfd908 HasContentPropertyKey

000007fef3f33708  40002cc      960 ...ependencyProperty  0   static 0000000002dfd948 HasContentProperty

000007fef3f33708  40002cd      968 ...ependencyProperty  0   static 0000000002dfdb00 ContentTemplateProperty

000007fef3f33708  40002ce      970 ...ependencyProperty  0   static 0000000002dfdc80 ContentTemplateSelectorProperty

3.利用!do命令查看依赖属性的成员变量值, 比如:

0:000> !do 0000000002dfd820

Name:        System.Windows.DependencyProperty

MethodTable: 000007fef3f33708

EEClass:     000007fef3dd7550

Size:        88(0x58) 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

000007fef7826970  400133c        8        System.String  0 instance 0000000002dfd630 _name

000007fef78282f8  400133d       10          System.Type  0 instance 0000000002d444b0 _propertyType

000007fef78282f8  400133e       18          System.Type  0 instance 0000000002dfab80 _ownerType

000007fef3f312a8  400133f       20 ....PropertyMetadata  0 instance 0000000002dfd7c0 _defaultMetadata

000007fef3f31088  4001340       28 ...dateValueCallback  0 instance 0000000000000000 _validateValueCallback

000007fef3f3e750  4001341       30 ...ndencyPropertyKey  0 instance 0000000000000000 _readOnlyKey

000007fef4194818  4001342       40         System.Int32  1 instance          4194530 _packedData

000007fef3f3e408  4001343       48 ....InsertionSortMap  1 instance 0000000002dfd868 _metadataMap

000007fef3f30fc8  4001344       38 ...erceValueCallback  0 instance 0000000000000000 _designerCoerceValueCallback

000007fef7825ac8  400133b      808        System.Object  0   static 0000000002d72000 UnsetValue

000007fef3f3c6c0  4001345      800 ...ty, WindowsBase]]  1   static 0000000012d5bb10 RegisteredPropertyList

000007fef7831c38  4001346      810 ...ections.Hashtable  0   static 0000000002d6f3d8 PropertyFromName

000007fef782c858  4001347      5c8         System.Int32  1   static              868 GlobalIndexCount

000007fef7825ac8  4001348      818        System.Object  0   static 0000000002d6f430 Synchronized

000007fef78282f8  4001349      820          System.Type  0   static 0000000002d68808 NullableType

4.利用.formats 得到依赖属性, 分2步

1)利用.formats 0n得到_packedData十六进制

2)   去掉高位,Decimal描述的就是依赖属性在依赖对象中的存储索引

如下:

0:000> .formats 0n4194530

Evaluate expression:

Hex:     00000000`004000e2

Decimal: 4194530

Octal:   0000000000000020000342

Binary:  00000000 00000000 00000000 00000000 00000000 01000000 00000000 11100010

Chars:   [email protected]

Time:    Wed Feb 18 21:08:50 1970

Float:   low 5.87779e-039 high 0

Double:  2.07237e-317

0:000> .formats 00e2

Evaluate expression:

Hex:     00000000`000000e2

Decimal: 226

Octal:   0000000000000000000342

Binary:  00000000 00000000 00000000 00000000 00000000 00000000 00000000 11100010

Chars:   ........

Time:    Thu Jan 01 08:03:46 1970

Float:   low 3.16693e-043 high 0

Double:  1.11659e-321

可知ContentProperty依赖属性在DataGridColumnHeader中的索引为226

5. 根据第4步的index,从第2步依赖对象的_effectiveValues 得到依赖属性的具体值,分3步:

1)利用!da -details 查看_effectiveValues 数组所有元素的值

2)查看每个元素,根据_propertyIndex (即第4步得到的Decimal值)确定依赖属性

3)利用!do命令查看元素的_value成员的值

比如:

0:000> !da -details 00000000042efb08

Name:        System.Windows.EffectiveValueEntry[]

MethodTable: 000007fef3f3e898

EEClass:     000007fef3e0c8a0

Size:        408(0x198) bytes

Array:       Rank 1, Number of elements 24, Type VALUETYPE

Element Methodtable: 000007fef3f36120

[0] 00000000042efb18

Name:        System.Windows.EffectiveValueEntry

MethodTable: 000007fef3f36120

EEClass:     000007fef3dd8c90

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

000007fef7825ac8  400136e        0            System.Object      0     instance     0000000002e1c5d8     _value

000007fef7830940  400136f        8             System.Int16      1     instance                    3     _propertyIndex

000007fef41949d0  4001370        a             System.Int16      1     instance                    2     _source

--------------------------------省略部分------------------------------

[15] 00000000042efc08

Name:        System.Windows.EffectiveValueEntry

MethodTable: 000007fef3f36120

EEClass:     000007fef3dd8c90

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

000007fef7825ac8  400136e        0            System.Object      0     instance     00000000042efca0     _value

000007fef7830940  400136f        8             System.Int16      1     instance                  226     _propertyIndex

000007fef41949d0  4001370        a             System.Int16      1     instance                   65     _source

可知ContentProperty为_effectiveValues的第16个元素, 其值存储在_value中

0:000> !do 00000000042efca0

Name:        System.Windows.ModifiedValue

MethodTable: 000007fef3f40d58

EEClass:     000007fef3e0d000

Size:        48(0x30) 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

000007fef7825ac8  4001387        8        System.Object  0 instance 0000000000000000 _baseValue

000007fef7825ac8  4001388       10        System.Object  0 instance 0000000000000000 _expressionValue

000007fef7825ac8  4001389       18        System.Object  0 instance 0000000000000000 _animatedValue

000007fef7825ac8  400138a       20        System.Object  0 instance 0000000002d93618 _coercedValue

6.根据第5步中的成员_coercedValue得到依赖属性的具体值,大功告成!

0:000> !do 0000000002d93618

Name:        System.String

MethodTable: 000007fef7826970

EEClass:     000007fef73aeec8

Size:        36(0x24) bytes

File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll

String:      导入数据源

Fields:

MT    Field   Offset                 Type VT     Attr            Value Name

000007fef782c858  40000ed        8         System.Int32  1 instance                5 m_stringLength

000007fef782b398  40000ee        c          System.Char  1 instance             5bfc m_firstChar

000007fef7826970  40000ef       10        System.String  0   shared           static Empty

>> Domain:Value  00000000007f85a0:0000000002d41420 <<

版权声明:本文为博主原创文章,欢迎转载,仅请署名

时间: 2024-10-11 11:15:40

Windbg调试WPF的依赖属性的相关文章

WPF之依赖属性

一站式WPF--依赖属性(DependencyProperty)一 一站式WPF--依赖属性(DependencyProperty)二 WPF之依赖属性

WPF的依赖属性和附加属性(用法解释较全)

转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最重要的知识点——依赖属性. 二.依赖属性的全面解析 听到依赖属性,自然联想到C#中属性的概念.C#中属性是抽象模型的核心部分,而依赖属性是专门基于WPF创建的.在WPF库实现中,

WPF利用依赖属性和命令编写自定义控件

以实例讲解(大部分讲解在代码中) 1,新建一个WPF项目,添加一个用户控件之后在用户控件里面添加几个控件用作测试, <UserControl x:Class="SelfControlDenpendy.SelfControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006

WPF: 只读依赖属性的介绍与实践

在设计与开发 WPF 自定义控件时,我们常常为会控件添加一些依赖属性以便于绑定或动画等.事实上,除了能够添加正常的依赖属性外,我们还可以为控件添加只读依赖属性(以下统称"只读属性"),以增加控件的灵活性. 这听起来有些矛盾.只读依赖属性,只能读不能写,却又怎么能提高控件的灵活性呢?想想我们常用的 IsMouseOver 等属性就可以理解,它们都是只读属性,但如果没有它们,想要控制样式将会很困难. 所以,总结来说,只读属性的特点是:无法赋值,不能绑定,不能用于动画,不能验证等:而之所以使

说说WPF的依赖属性

首先,我们先来大概了解一下依赖属性 什么是依赖属性:依赖属性自己没有值,通过依赖别人(如Binding)来获得值. 依赖属性为什么会出现:控件常用字段有限,包装太多属性会占用过高内存,造成浪费.所以用依赖属性,用不着就不用,用得着就用. 怎么声明依赖属性:用public static readonly三个修饰符修饰. 怎么声明实例:使用DependencyProperty.Register方法生成.此方法有三个参数跟四个参数. 怎么操作依赖属性的值:利用依赖对象(Dependency Objec

(WPF)依赖属性

属性触发器: <Button MinWidth=" 75" Margin="10"> <Button.Style> <Style TargetType="{x:Type Button}"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Proper

WPF自定义控件 依赖属性绑定

控件cs文件 using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Markup; using System.Windows.Media; namespace Controls { [TemplatePart(Name = "PART_DropDown"

WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核心)

一. 摘要 首先圣殿骑士非常高兴这个系列能得到大家的关注和支持.这个系列从七月份開始到如今才第七篇,上一篇公布是在8月2日,掐指一算有二十多天没有继续更新了,最主要原因一来是想把它写好,二来是由于近期几个月在筹备"云计算之旅"系列,所以一再推迟了公布进度. 之前一直都没有想过要录制视频.基本的原因还是怕自己知识有限,从而误导他人,所曾经几次浪曦和51CTO邀请录制视频,我都以工作忙.公司内部培训须要时间和自己有待提高等理由委婉的拒绝了,说实在的.自己也知道自己还有非常多地方有待提高.还

WPF 依赖属性概念

理解依赖属性 在 WPF 中变成相比较于 传统 Windows Forms 变成发生了较大的改变. 属性现在以一组服务的形式提供给开发人员. 这组服务就叫做属性系统. 由 WPF 属性系统所支持的属性成为依赖属性. 依赖属性的概念 WPF 在依赖属性中提供了标准属性无法提供的功能, 特性如下: 决定属性值: 依赖属性的属性值可以在运行时有其他元素或者是其他信息所决定, 决定的过程具有一个优先次序. 自动验证或变更通知: 依赖属性哟一个自定的回调方法, 当属性值变更时被执行, 这个回调能验证新的值