2017-07-07 75 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