2011-02-07 2 views
2

Я отлаживаю утечку памяти. Я не могу воспроизвести его, но когда программа работает в определенных обстоятельствах, я получаю постоянную утечку около 60 МБ/ч. Через несколько дней я беру дамп, когда куча ~ 2 ГБ и присоединяется к WinDbg.WinDbg - просмотр System.Web.Compilation.BuildManager's ResultCache

! Heapdump -stat
Показано, что Hashtables составляет 1,2 ГБ. Это около 55% кучи.

! Dumpheap -Type System.Collections.Hashtable + KeyCollection
Дает адрес 153,080 экземпляров Hashtable.

! Gcroot из нескольких из этих экземпляров указывает, что все они принадлежат Threads, принадлежащим Me.Logger.

RSP:28f67e840:Root:0000000245edb7d0(Me.Logger)-> 
0000000245edb9d8(System.Threading.Thread)-> 
00000002459b9830(System.Runtime.Remoting.Contexts.Context)-> 
00000002459b9548(System.AppDomain)-> 
0000000245a1fed0(System.ResolveEventHandler)-> 
00000002259697a0(System.Web.Compilation.BuildManager)-> 
0000000245a20120(System.Web.Compilation.MemoryBuildResultCache)-> 
00000002459c2a48(System.Web.Caching.CacheMultiple)-> 
00000002459c2a70(System.Object[])-> 
00000002459c7e08(System.Web.Caching.CacheSingle)-> 
00000002459c9008(System.Web.Caching.CacheUsage)-> 
00000002459c9030(System.Object[])-> 
00000002459c9138(System.Web.Caching.UsageBucket)-> 
00000001b996fba8(System.Web.Caching.UsagePage[])-> 
00000001ae054388(System.Web.Caching.UsageEntry[])-> 
0000000251576590(System.Web.Caching.CacheEntry)-> 
00000002515761a0(System.Web.Mobile.MobileCapabilities)-> 
00000002515742c8(System.Collections.Hashtable)-> 
0000000251576548(System.Collections.Hashtable+KeyCollection) 

Я не знаю, как интерпретировать этот выход. Кажется, что System.Web.Compilation.BuildManager просто имеет массивный кеш.

BuildManager, MobileCapabilities, ResolveEventHandler - я не использую это в своей кодовой базе.

Я новичок в WinDbg. Как мне отладить это дальше?

Как я могу увидеть, что находится в Hashtables? (SoS v2.0.50727, так что нет! DumpCollection). Как я могу узнать, что построил BuildManager?

ответ

0

Вы пробовали расширение SOSEX? http://www.stevestechspot.com/default.aspx. Он имеет большую часть функциональности SOS включая ! DumpCollection команды, что вам нужно (хотя я не проверял, работает ли он с V2 в CLR) и, возможно, некоторые другие полезные вещи ..

Также возможно этот блог может помочь вам, у нее есть довольно хорошая информация об управляемой утечке утечки памяти:

http://blogs.msdn.com/b/tess/archive/2008/04/03/net-debugging-demos-lab-7-memory-leak-review.aspx?PageIndex=1