如何在windbg中找到DispatcherTimer的事件处理程序

时间:2010-09-02 09:24:44

标签: silverlight-3.0 windbg

我有一个Silverlight 3应用程序,似乎泄漏了DispatcherTimer对象。至少,随着应用程序运行的时间我在堆上找到更多它们:

!dumpheap -type DispatcherTimer

返回一个递增的数字。

我想为这些找到Tick事件处理程序方法,以便我可以识别它们在我的代码中的创建位置。

当我尝试在windbg中转储其中一个时,我会得到类似的结果:

!do 098b9980
Name:        System.Windows.Threading.DispatcherTimer
MethodTable: 0bfd4ba0
EEClass:     0bc98d18
Size:        20(0x14) bytes
File:        C:\Program Files (x86)\Microsoft Silverlight\4.0.50524.0\System.Windows.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
0bfd1538  40008be        4 ...eObjectSafeHandle  0 instance 098b9994 m_nativePtr
0bfd3d0c  40008bf        8 ...reTypeEventHelper  0 instance 098b99ac _coreTypeEventHelper
506a07e4  40008c0        c       System.Boolean  1 instance        1 _isEnabled
0bfd3c68  40008c1      cec ...ependencyProperty  0   shared   static IntervalProperty
    >> Domain:Value  086d3f38:NotInit  086daeb8:098b99b8 <<

但是从这里开始,我不知道如何找到处理Tick事件的方法。我怀疑它与_coreTypeEventHelper有关,但当我转储它时,我得到:

!do 098b99ac 
Name:        MS.Internal.CoreTypeEventHelper
MethodTable: 0bfd3d0c
EEClass:     0bc98420
Size:        12(0xc) bytes
File:        C:\Program Files (x86)\Microsoft Silverlight\4.0.50524.0\System.Windows.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
00000000  40009f5        4                       0 instance 098b9ae4 _eventAndDelegateTable
506a0e94  40009f4      514         System.Int32  1   shared   static _nextAvailableTableIndex
    >> Domain:Value  086d3f38:NotInit  086daeb8:669 <<

然后我转储_eventAndDelegateTable:

Name:        System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib],[MS.Internal.CoreTypeEventHelper+EventAndDelegate, System.Windows]]
MethodTable: 0bfcc0a0
EEClass:     5026c744
Size:        52(0x34) bytes
File:        C:\Program Files (x86)\Microsoft Silverlight\4.0.50524.0\mscorlib.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
5068f2d0  4000648        4       System.Int32[]  0 instance 098b9b18 buckets
50691060  4000649        8 ...non, mscorlib]][]  0 instance 098b9b30 entries
506a0e94  400064a       20         System.Int32  1 instance        1 count
506a0e94  400064b       24         System.Int32  1 instance        1 version
506a0e94  400064c       28         System.Int32  1 instance       -1 freeList
506a0e94  400064d       2c         System.Int32  1 instance        0 freeCount
50697f08  400064e        c ...Int32, mscorlib]]  0 instance 098b9650 comparer
506ccfb0  400064f       10 ...Canon, mscorlib]]  0 instance 00000000 keys
506ceaac  4000650       14 ...Canon, mscorlib]]  0 instance 00000000 values
506a02e4  4000651       18        System.Object  0 instance 00000000 _syncRoot
506895d8  4000652       1c ...SerializationInfo  0 instance 00000000 m_siInfo

然后我有点迷失了!

1 个答案:

答案 0 :(得分:1)

在尝试查找相关事件处理程序之前,您还可以通过调查DispatcherTimer实例未被释放的原因来搜索泄漏源。 获得!dumpheap -type DispatcherTimer的输出后,在!gcroot的几个实例上执行DispatcherTimer命令。您应该能够看到哪个对象包含对计时器的引用 此外,您可以放置​​适当的断点(使用!bpmd),以获得有用的堆栈跟踪。