2010-09-02 66 views
1

我有一个Silverlight 3应用程序,它似乎在泄漏DispatcherTimer对象。至少,随着时间的推移,当应用程序运行时,我觉得更多的人在堆上:如何在windbg中找到DispatcherTimer的事件处理程序

dumpheap型DispatcherTimer

返回他们的increating数!

我想找到这些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

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

相关问题