2012-12-05 146 views

回答

12

對於最簡單的方法 - 跳到底部以瞭解有關執行此操作的說明與Visual Studio 2013年


現在可能有一些新的工具 - 也許某事在更新Visual Studio和我很想找到關於這些,但我想的WinDbg取得了一些成功之前。下面是我對如何做到這一點的老調:

1. Create dump file from process manager 
2. Run WinDbg (X64) 
3. File/Open Crash Dump… (Crtl+D) 
4. Run following: 

lm 
.load C:\windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll 
.sympath SRV*c:\localsymbols*http://msdl.microsoft.com/download/symbols 
.symfix 
.reload 
!dumpheap -stat 

需要注意的是,如果你的過程中,如果86,特別是如果你在Windows的64位版本上運行 - 你需要使用調試器的x86版( WinDbg提供兩個版本)來保存轉儲。 SOS是WinDbg的託管內存調試擴展,不支持調試x86位進程的x64位轉儲。然後,您還需要分別更新SOS路徑,所以它看起來是這樣的:

.load C:\windows\Microsoft.NET\Framework\v4.0.30319\sos.dll 

可能不是所有的這些命令是必要的,但是這是對我工作。現在

你可以發現,似乎在太多情況下

!DumpHeap -type TypeName 

存在的對象的類型,其中類型名稱是該類型只是名字 - 沒有必要完全合格的命名空間。現在

你可以查閱一下保持該對象在內存中:因爲應用程序似乎得到暫停,當你一個調試器附加

!GCRoot Object_Address 

現場調試並沒有爲我工作。我想我看到了一個讓應用程序停留在內存中的選項,但是我忘記了它的位置,但是對於內存分析 - 查看靜態轉儲文件可能就足夠了。


您可以下載WinDbg,從而使Windows SDK中的一部分,或作爲here的「Windows調試工具」獨立下載。

要創建轉儲文件 - 轉到任務管理器,右鍵單擊某個過程並選擇「創建轉儲文件」。


一些更多的鏈接:

http://blogs.microsoft.co.il/blogs/sasha/archive/2012/10/15/diagnosing-memory-leaks-in-managed-windows-store-apps.aspx

http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx

http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/f3a3faa3-f1b3-4348-944c-43f11c339423

http://msdn.microsoft.com/en-us/library/bb190764.aspx

http://blogs.msdn.com/b/dougste/archive/2009/02/18/failed-to-load-data-access-dll-0x80004005-or-what-is-mscordacwks-dll.aspx


*編輯

根據.NET Memory Allocation Profiling with Visual Studio 2012由Stephen Toub - PerfView工具支持在分析.NET Windows應用商店中的應用程序泄漏。與Vance Morrison here查看文章和視頻演練。


* EDIT 2

的Visual Studio 2013預覽增加了一個新的選擇,分析從轉儲文件管理的內存堆。要做到這一點 - 只需在Visual Studio調試器中暫停應用程序,通過調試/保存轉儲另存爲當前轉儲,然後恢復執行並使用您的應用程序,直到發生可疑泄漏並再次轉儲。然後轉到文件/打開/文件並打開第二個轉儲文件。在「操作」面板中的轉儲摘要右側,您會看到一個「調試託管內存」操作。選擇它,然後在「Select Baseline」中選擇你的第一個轉儲文件。您將看到託管堆上的對象列表,按類型分組,並帶有計數差異。請注意,您通常會首先查看具有低的非零計數差異的對象以跟蹤單個泄漏源。您可以通過展開參考圖視圖中的樹來深入查看對象列表,並查看將它們保留在內存中的內容。

+0

更多更新鮮的鏈接:http://blogs.microsoft.co.il/blogs/sasha/archive/2012/10/15/diagnosing-memory-leaks-in -managed-windows-store-apps.aspx –

+0

也可以使用wpr(Windows Performance Recorder)命令和wpa(Windows性能分析器)讀取的etl(Event Trace Log)文件來查找泄漏,儘管我還沒有玩過它。檢查這些可能包含一些有用信息的鏈接http://www.idigitalhouse.com/Blog/?p=155 http://blogs.msdn.com/b/ntdebugging/archive/2012/11/30/troubleshooting-pool -leaks-part-7-windows-performance-toolkit.aspx –

+1

人們應該注意,「調試託管內存」選項僅在Visual Studio 2013 Ultimate中可用,轉儲是從.NET 4.5進程創建的。更多信息:http://blogs.msdn.com/b/visualstudioalm/archive/2013/06/20/using-visual-studio-2013-to-diagnose-net-memory-issues-in-production.aspx –