Dot-Net
如何調試.net 垃圾收集?
是否可以查看呼叫 GC.Collect() 時收集的所有 .net 對象?
我需要查看哪些對象仍在記憶體中且未回收,因此我可以找到應該手動回收對象但被程序員遺忘的位置。
我不想呼叫 GC.Collect,因為某個地方的某個人忘記了處理一個阻塞某些句柄的對象。
我發現最好的方法是使用 windbg 和 SOS(罷工之子)擴展。它有一個相當神秘的命令行,但它非常強大。它具有轉儲堆並將其除以 GC 分代堆的能力。一旦你通過了最初的學習曲線,就很容易在堆的哪個部分跟踪哪些對像是活動的。以下是一些使用 SOS 範例的網站
- http://blogs.msdn.com/tess/archive/2005/11/25/dumpheap-stat-explained-debugging-net-leaks.aspx
- http://geekswithblogs.net/.NETonMyMind/archive/2006/03/14/72262.aspx
- http://dotnetdebug.net/2005/07/04/dumpheap-parameters-and-some-general-information-on-sos-help-system/
EDIT OP 詢問了 sos.dll 的位置。它包含在 .Net Framework 的安裝中。它位於
%WINDIR%\Microsoft.Net\Framework\V2.0.50727\sos.dll
但是一旦你載入了windbg,你就不需要完整的路徑了。只有我們 .loadby 方法。
.loadby sos mscorwks.dll
它將在與目前版本的 mscorwks(CLR)相同的目錄中查找 sos 的版本