Memory Leak Debug with Visual Studio ...

结合这篇文章,完善一下Windows 和 Linux 内存泄漏 debug。

本文总结一下之前在Windows上debug的一个内存泄漏问题的经过:

一般一个程序出现少量内存泄漏的话(如果不是很严重),需要观察一段时间的内存占用才能被发现问题(或者使用 _CrtMemCheckpoint 函数,见下文)。

观察内存占用一般是两个地方:

  • 打开Task Manager->Details 标签
  • 或者,打开 “Resource Monitor”

如图(Commit 即程序所申请的虚拟内存空间):
Resource Monitor

如果毫无头绪(因为代码是别人写的),可以通过注释部分代码,或者改写部分代码来简化代码的逻辑。将内存泄漏定位在某个函数 或者 某个对象中。在简化后的代码中debug会容易得多。

  1. 如果可能是new出来的对象没有被析构,可以通过在对象的构造函数和析构函数中打断点,然后查看构造函数和析构函数调用的次数是否相同。
  2. 如果不好跟踪析构函数,可以在new处打断点,然后获得new出来的地址值(ptr: 0x12345678)。并且设置数据断点(或者在delete处设置条件断点)。如图(这样就可以判断该地址是否被delete):
    在这里插入图片描述

如果你想找到某处是否有内存泄漏,你可以看一下这个函数_CrtMemCheckpoint ( 需要 #include <crtdbg.h>):

_CrtMemState s1, s2, s3;  
_CrtMemCheckpoint( &s1 );  
// memory allocations take place here  
_CrtMemCheckpoint( &s2 );  

if ( _CrtMemDifference( &s3, &s1, &s2) )  
   _CrtMemDumpStatistics( &s3 );  

如果输出如下:

0 bytes in 0 Free Blocks.
144 bytes in 4 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 77808 bytes.
Total allocations: 22671895 bytes.

表示两处_CrtMemCheckpoint之间的代码有 114 byte 的内存差异或者泄漏
如果是负数, 诸如 -7 bytes in 0 Normal Blocks. 此类的信息,表示在这两个checkpoint之间, delete 的内存大于 new 出来的内存。
see link1, link2


如果你的程序能够全局替换 operator new operator delete etc. ,你可以看一下这个项目:https://github.com/r-lyeh-archived/tracey

如果不能替换operator new operator delete 又不想通过手动地查看某个地址是否被析构,可以通过使用 _CrtSetAllocHook, _CrtGetAllocHook, _CrtIsValidHeapPointer 这些函数来实现自己的内存泄漏检测工具。但是,写好一个工具也不是件容易的事情,必须保证工具足够健壮,功能完善。

当然,除此之外,微软也提供了其他一些工具帮助检测内存泄漏,see link:

  1. https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/finding-a-memory-leak
  2. https://docs.microsoft.com/en-us/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2017

other link:

1.http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml
2.http://www.flipcode.com/archives/Detecting_Memory_Leaks.shtml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值