Windbg调试WPF的依赖属性

原创 2015年07月09日 20:44:52

我们用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:   .....@..
  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 <<



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

WinDbg调试unity3d无响应实战

今天终于让我碰上了,无响应了,毫无疑问,马上放下一切工作,Attach上去。     首先看下任务管理器,cpu 13% ,应该是死循环了。(注意 win7死循环是不会cpu 100%的)。   ...
  • yxriyin
  • yxriyin
  • 2015年02月02日 18:43
  • 1609

windbg 通过网络联机调试配置

Setting Up Kernel-Mode Debugging over a Network Cable Manually 05/23/2017 9 minutes to read Contr...
  • a3125504x
  • a3125504x
  • 2017年11月01日 16:19
  • 96

Windows下利用WinDBG、OllyDBG进行源码级调试

一般应用程序编译后会创建exe/dll/sys(可执行文件)、pdb(程序数据库)、map(编译信息)等文件,而源码调试需要可执行文件、程序数据库文件、还有源代码文件。(由于符号信息已经写入到程序数据...
  • lixiangminghate
  • lixiangminghate
  • 2017年01月19日 23:26
  • 1418

Windbg调试程序

Windbg调试程序 WinDbg是微软开发的免费源码级调试工具。Windbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。由于大部分程序员不需要做Kernel...
  • aoebug
  • aoebug
  • 2016年07月22日 21:39
  • 245

windbg设置双机调试的方法

windbg已不提供单独下载,wdk驱动开发工具包里附带有这个调试器.官网提供下载: http://msdn.microsoft.com/en-us/windows/hardware/gg487...
  • u011391040
  • u011391040
  • 2016年07月01日 11:17
  • 434

vmware+windbg双击调试设置

1.在vm中装上XP系统,最好和主机一样 2.为vm系统设置一个串口,在关闭系统的情况下, vm中点击 VM-->settings-->添加(add)-->串口-->使用命名管道 第一项是管道名...
  • Ansbic
  • Ansbic
  • 2014年05月21日 18:21
  • 926

windbg调试服务程序

相比通过输出日志来跟踪程序运行状态,我更倾向使用调试器。虽然我早知调试服务很麻烦,总不会比调试驱动还麻烦吧?基于这个想法,我尝试了在win7上使用windbg调试服务并记录于此。     window...
  • lixiangminghate
  • lixiangminghate
  • 2016年12月28日 15:57
  • 1384

使用WinDbg作为默认调试器, 调试本机应用程序

今天在写一个文件合并小工具,  因为程序较小,  编译成Release版带调试符号, 直接运行的. 后来改了点东西, 运行时突然报错. 我以前已经运行过(WinDbg -I), 在本机已经将Win...
  • LostSpeed
  • LostSpeed
  • 2013年07月01日 17:05
  • 3851

第三十二篇:Windbg中USB2.0调试环境的搭建

2011年的时候,为了开发USB Mass storage -- UASP (USB attached SCSI Protocol)的设备驱动程序,从米国买了两个USB2.0的调试小设备(如下图,每个...
  • u013140088
  • u013140088
  • 2014年12月24日 10:50
  • 1897

windbg远程调试方法

WinDBG的远程调试由服务端和客户端组成,和visualstudio类似。 被调试的机器是服务端(server), 我们做调试的机器是客户端(client)。 两台机器都需要安装WinDBG。 第...
  • ytfrdfiw
  • ytfrdfiw
  • 2013年04月28日 22:14
  • 8513
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windbg调试WPF的依赖属性
举报原因:
原因补充:

(最多只允许输入30个字)