Windows平台release版本内存泄漏检查办法

51 篇文章 2 订阅
13 篇文章 1 订阅

release版本内存泄漏的使用工具是Leakdiag

下载安装

下载地址:

链接:https://pan.baidu.com/s/1m_eJI3Iy-CNWLghpj5cyvw 
提取码:qite

Leakdiag下载之后按照默认设置安装,否则好像是会出问题的。默认安装是直接装在C盘下。
Logs文件夹里边存储的就是记录的日志,我们则是通过启动leakdiag应用程序进行检测。

LeakDiag支持5种不同的分配:

1) Virtual Memory Allocator 虚拟分配。 这种分配可追踪用VirtualAlloc/ VirtualAllocEx 等关于虚拟内存分配的内存。此时,选择LeakDiag 上[Memory allocators] 选项的“Virtual Memory Allocator”来检测。
2)Windows Heap Allocator 堆分配。这种分配可追踪NTDLL.DLL中如下函数分配的内存。
· RtlCreateHeap,
· RtlDestroyHeap,
· RtlAllocateHeap,
· RtlFreeHeap,
· RtlReAllocateHeap,
· LocalReAlloc,
· LocalFree,
· LocalAlloc,
· LocalReAlloc,
· GlobalAlloc,
· GlobalReAlloc and
· GlobalFree
此时,选择LeakDiag 上[Memory allocators] 选项的“Windows Heap Allocator”来检测。
3) MPHeap Allocator 线程局部存储(Thread Local Storage,TLS指允许一个进程的多个线程存储每个线程所独有的数据的一种Win32 机制)分配。这种分配可追踪MSDART32.DLL中如下函数分配的内存。
· MPHeapAlloc,
· MPHeapFree and
· MPHeapReAlloc
此时,选择LeakDiag 上[Memory allocators] 选项的“MPHeap Allocator”来检测。
4) COM Allocator COM分配(外部和内部)。这种分配可追踪OLE32.DLL,OLEAUT32.DLL 中如下函数分配的内存。
· CoGetMalloc,
· CoTaskMemAlloc,
· CoTaskMemFree,
· CoTaskMemRealloc,
· CRetailMalloc_Alloc,
· CRetailMalloc_Free,
· CRetailMalloc_Realloc,
· SysAllocStringLen,
· SysAllocStringByteLen,
· SysAllocString,
· SysFreeString,
· SysReAllocString and
· SysReAllocStringLen
此时,选择LeakDiag 上[Memory allocators] 选项的“COM Allocator”或“COM Internal Allocator”来检测。
5) C Runtime Allocator C运行时分配。这种分配可追踪MSVCRT.DLL中如下函数分配的内存。
· malloc,
· calloc,
· realloc,
· free,
· new,
· new[],
· delete and
· delete[]
此时,选择LeakDiag 上[Memory allocators] 选项的“C Runtime Allocator”来检测。

测试内存泄漏过程

我的工程名字叫MFCTest,然后启动调试,会出现MFCTest.exe。
然后启动Leakdiag应用程序,见上图,我们首先在application里边找到MFCTest.exe,然后在Memory allocators这里选择Heap Allocator,因为内存泄漏主要是因为程序员申请了空间忘记释放,这些内存空间都是在堆区申请,所以查看堆区就好了。先按下start,  然后在MFCTest.exe 处理正常的业务操作,觉得程序已经把我们要检测的部分都跑好了, 我们点击Log按钮,此时如果有内存泄漏,会在Logs文件夹下 生成xml文件,最后可以按stop,至此操作结束。

测试的过程是MFCTest.exe 调用testDll.dll 的memoryvld 函数内存泄漏。

TESTDLL_API void memoryvld()
{
    char *p = new char[100];
}

查看xml日志

在Logs目录里边出现了刚刚记录的xml文件;

 看xml 分析可知是在f:\test\stdtest\testdll\testdll.cpp 文件的memoryvld函数 ,第76行出现问题。

再对比源码,真的是在此位置出现内存泄漏。见下图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>