2017-07-07 71 views
1

在Visual Studio中如何在c#項目中查看和監視非託管內存使用情況?有沒有辦法在調試後檢查分配的內存是否被正確刪除?如何查看非託管內存使用情況?

代碼: pv_Memory = Marshal.AllocHGlobal(0x200000);

我試圖到Visual Studio 2015年中使用「診斷工具」,可以看到內存的增加,雖然它似乎沒有分離出非託管對象和內存。

任何提示?謝謝。

配置: 1的Visual Studio 2015年 2. C#應用程序中引用第三方.NET庫,它是一個非託管庫的包裝 3. Windows 7的

+0

通常,本地代碼(例如c/C++)必須編譯爲特定的標誌以啓用內存泄漏檢測,並且通常您不知道是否有泄漏,直到進程退出 – MickyD

+0

@MickyD如何檢查泄漏在流程退出? – sammy

+0

微軟CRT做它 – MickyD

回答

0

使用MS內置工具CLRProfiler和性能監視器(性能監視器)。你可以在互聯網上獲得它的文檔,看這link。檢查ILDASM(IL反彙編程序)工具。

1

當您使用AllocHGlobal你是從非託管的C/C++堆中分配。您可以使用堆分配跟蹤來跟蹤它。

class Program 
{ 
    private static IntPtr pv_Memory; 

    static void Main(string[] args) 
    { 
     Console.ReadLine(); 
     for(int i=0;i<10;i++) 
     { 
      pv_Memory = Marshal.AllocHGlobal(0x200000); 
     } 

     Console.WriteLine("Hello World!"); 
     Console.ReadLine(); 

    } 
} 

來自Windows Performance Toolkit的xperf允許您附加到已經運行的進程以獲取堆分配數據。

enter image description here

您可以用WPA數據。 好文章來源: http://blogs.microsoft.co.il/sasha/2014/12/02/diagnosing-native-memory-leaks-etw-wpa/

這是相當強大的,但它需要一些練習。

+0

不錯! +1好的先生 – MickyD