Я новичок в WinDBG. Я ищу причину утечки памяти и дошел до того, что мои нынешние знания могут унести меня.
В моем приложении MVVM есть утечка MyLovelyView
объектов.
В WinDBG я запускаю !dumpheap -type MyLovelyView
и получаю следующее:
Address MT Size
05f2a978 0bc948d4 12
05f39638 04d51114 36
05f398d4 04d27734 96
05f7db28 04d51114 36
05f7dd70 04d27734 96
05fc48f4 04d51114 36
05fc4b3c 04d27734 96
total 0 objects
Statistics:
MT Count TotalSize Class Name
0bc948d4 1 12 MyNamespace.Unity.ProviderUnityExtension+FactoryStrategy+Provider`1[[IMyLovelyViewModel, MyNamespace]]
04d51114 3 108 MyNamespace.MyLovelyViewModel
04d27734 3 288 MyNamespace.MyLovelyView
Total 7 objects
Я знаю, что в данный момент у меня не должно быть никаких MyLovelyView
объектов в памяти, и я заставил GC запускаться несколько раз, чтобы они не просто зависали.
Поэтому я проверяю корни с помощью команды !gcroot 05f7dd70
, что приводит к следующему:
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 5 OSTHread 3428
Scan Thread 19 OSTHread 36a0
Scan Thread 20 OSTHread 1280
Scan Thread 23 OSTHread 2e90
Scan Thread 24 OSTHread 3738
Scan Thread 27 OSTHread 2398
DOMAIN(04936520):HANDLE(Pinned):44f12f8:Root: 066e4260(System.Object[])->
056f946c(System.Collections.Generic.List`1[[System.Object, mscorlib]])->
05ed1920(System.Object[])->
05f8891c(ThirdParty.Control.DiagramPanel)->
05f7e1e8(ThirdParty.Control.Diagram)->
05f7f79c(System.Windows.DataContextChangedEventHandler)->
05f7f748(System.Windows.Data.BindingExpression)->
05f7db28(MyNamespace.MyLovelyViewModel)->
05f7dd70(MyNamespace.MyLovelyView)
Я пытался воспроизвести утечку, используя сторонние элементы управления, это простое фиктивное приложение, и до сих пор не удалось.
В этот момент я застрял. Кто-нибудь с большим опытом отладки знает, каким должен быть мой следующий шаг?
Для получения дополнительной информации было бы полезно увидеть, что XAML в MyLovelyView
выглядит примерно так:
<Grid x:Name="LayoutRoot" Background="White">
<Control:Diagram SomeProperty="{Binding SomeBoundProperty}" />
</Grid>
Спасибо
ОБНОВЛЕНИЕ: Если я удалю привязку из XAML (см. Выше), вывод !gcroot
будет выглядеть следующим образом:
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 5 OSTHread 36b4
Scan Thread 20 OSTHread 17c0
Scan Thread 21 OSTHread 3300
Scan Thread 22 OSTHread 3570
Scan Thread 23 OSTHread 2968
Scan Thread 26 OSTHread 2934
Scan Thread 27 OSTHread 34d8
DOMAIN(04DA8FE8):HANDLE(Pinned):37812f8:Root: 07324260(System.Object[])->
0633946c(System.Collections.Generic.List`1[[System.Object, mscorlib]])->
06a72860(System.Object[])->
06b3823c(ThirdParty.Control.DiagramPanel)->
06b2d8f8(ThirdParty.Control.Diagram)->
06b2f568(System.Windows.Controls.Grid)->
06b2d67c(MyNamespace.MyLovelyView)->
06b2d7f0(System.Windows.DataContextChangedEventHandler)->
06b2d79c(System.Windows.Data.BindingExpression)->
06b2d434(MyNamespace.MyLovelyViewModel)
(все адреса памяти изменились, потому что это повторный запуск)