用于混合模式项目的内存泄漏检测:托管、非托管和本机

Memory leak detection for mixed mode projects: managed, unmanaged and native

本文关键字:托管 本机 检测 模式 混合 项目 泄漏 内存 用于      更新时间:2023-10-16

我有一个Visual Studio 2010解决方案,其中包含c#(托管),c++/CLI(非托管)和纯c++(本地)项目。我想在所有3个项目或至少围绕本机代码执行内存泄漏检测:

  • c#项目引用了非托管的dll(我可以访问常用的。net内存分析工具,所以在它上面运行内存分析并不是一个真正的问题)。
  • c++/CLI是一个非常薄包装在本地c++库,所以我真的不需要配置它(不担心)。
  • c++原生代码是最难分析的。

我试过使用Intel Inspector XE 2011,但它太慢了…做一件简单的事情,比如初始化我的系统,花了很长时间,我甚至还没有看到它完成。当我在没有IXE 2011的情况下运行我的系统时,初始化系统只需要10-15秒,而使用IXE时,我们让它运行了几个小时,它还没有完成初始化。我已经尝试将某些库排除在概要分析之外,但是完全没有效果。

我试过使用可视化泄漏检测器,但在完成运行后,它说它找不到任何内存泄漏。我很怀疑这个结果,所以我故意在一个经常运行的函数中放置了一段代码,以确保存在内存泄漏:

int* memoryLeak = new int;

我再次运行VLD,但它吐出同样的信息。我正在考虑覆盖new/delete操作符,甚至只是malloc/free,但我想确保在我深入研究之前我已经用尽了所有其他选择。

如何在Visual Studio 2010中配置本机c++库的内存使用情况?是否有其他工具或技术可以工作(即使它们不与VS2010集成)?

在。net中,即使你使用托管对象,也可能有一些东西永远不会被处理(查看这里的一些例子:c#中的内存泄漏)。

关于本机部分,您可以使用两种不同的方法:

  • 使用不同的内存分析器软件,这里列出了许多:是否有一个好的Valgrind替代Windows?

  • 更改源代码以使用调试malloc/new并打印代码中分配完成的位置:http://www.flipcode.com/archives/Detecting_Memory_Leaks.shtml

创建单元测试,测试单元是否存在内存泄漏:http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

在分配对象之前获取第一个内存状态,在释放对象之后获取第二个内存状态。比较你的记忆状态

你也可以尝试使用其他的分析器,如valgrind, devpartner。