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行出现问题。
再对比源码,真的是在此位置出现内存泄漏。见下图