Как найти обработчик события DispatcherTimer в windbg - PullRequest
1 голос
/ 02 сентября 2010

У меня есть приложение Silverlight 3, которое, похоже, пропускает объекты DispatcherTimer.По крайней мере, со временем, когда приложение запускается, я нахожу их больше в куче:

! Dumpheap-type DispatcherTimer

возвращает их возрастающее число.

I 'Я хотел бы найти метод обработчика событий 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 Ответ

1 голос
/ 03 сентября 2010

Прежде чем пытаться найти соответствующий обработчик событий, вы также можете найти источник утечки, выяснив, почему экземпляры DispatcherTimer не освобождаются.
Получив вывод !dumpheap -type DispatcherTimer, выполните команду !gcroot на нескольких экземплярах DispatcherTimer. Вы должны увидеть, какой объект содержит ссылку на таймер.
Кроме того, вы можете разместить соответствующие точки останова (используя !bpmd), чтобы получить полезные трассировки стека.

...