2

メモリリークをデバッグしています。再現できませんが、特定の状況でプログラムを実行すると、約 60MB/hr の安定したリークが発生します。数日後、ヒープが ~2GB になったらダンプを取り、WinDbg をアタッチします。

!heapdump –stat
1.2 GB 相当のハッシュテーブルがあることを示します。これはヒープの約 55% です。

!dumpheap -Type System.Collections.Hashtable+KeyCollection
153,080 の Hashtable インスタンスのアドレスを提供します。

これらのインスタンスのいくつかの !gcroot は、それらがすべて 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 がビルドしたものを確認するにはどうすればよいですか?

4

1 に答える 1

0

SOSEX 拡張機能を試しましたか? http://www.stevestechspot.com/default.aspx。必要な!DumpCollectionコマンドを含む SOS のほとんどの機能(CLR の V2 で動作するかどうかはテストしていませんが) と、その他の便利な機能が含まれている可能性があります。

また、このブログが役立つかもしれません。彼女はマネージ メモリ リークのデバッグに関する非常に優れた情報を提供しています。

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

于 2011-03-08T10:10:17.523 に答える