内存泄露检测工具LeakDiag的使用 .
来源:互联网 发布:js object 转为字符串 编辑:程序博客网 时间:2024/05/22 11:54
LeakDiag是微软一款检测memory leak的工具,使用比较简单
首先去下载一个ftp://ftp.microsoft.com/PSS/Tools/Developer%20Support%20Tools/LeakDiag/
安装好,默认是在c:/leakdiag
然后写一个测试程序来测试
#include <stdio.h>
#include <windows.h>
int main()
{
while(1)
{
char*c =new char[10];
printf("%s",c);
Sleep(1000);
}
return 0;
}
#include <windows.h>
int main()
{
while(1)
{
char*c =new char[10];
printf("%s",c);
Sleep(1000);
}
return 0;
}
在LeakDiag中选择aaa.exe
然后选择Windows Heap Allocator来跟踪heap的使用,按start开始,等一会按log,然后再stop
会在c:/leakdiag/Logs下面生成一个log
关键的部分是
<LEAKS ver="1.25.28.2201">
<STACK numallocs="05" size="048" totalsize="0240">
<STACKSTATS>
<SIZESTAT size="048" numallocs="05"/>
<HEAPSTAT handle="340000" numallocs="05"/>
</STACKSTATS>
<FRAME num="0" dll="aaa.exe" function="" filename="" line="" addr="0x407a72" offset="0x00007A72"/>
<FRAME num="1" dll="aaa.exe" function="" filename="" line="" addr="0x402ff2" offset="0x00002FF2"/>
<FRAME num="2" dll="aaa.exe" function="" filename="" line="" addr="0x402df9" offset="0x00002DF9"/>
<FRAME num="3" dll="aaa.exe" function="" filename="" line="" addr="0x402dd6" offset="0x00002DD6"/>
<FRAME num="4" dll="aaa.exe" function="" filename="" line="" addr="0x40112f" offset="0x0000112F"/>
<FRAME num="5" dll="aaa.exe" function="" filename="" line="" addr="0x401038" offset="0x00001038"/>
<FRAME num="6" dll="aaa.exe" function="" filename="" line="" addr="0x401269" offset="0x00001269"/>
<FRAME num="7" dll="KERNEL32.dll" function="GetSortTablesFileInfo" offset="0xC" filename="" line="" addr="0x7C5989D5"/>
<STACKID>00524008</STACKID>
</STACK>
</LEAKS>
<STACK numallocs="05" size="048" totalsize="0240">
<STACKSTATS>
<SIZESTAT size="048" numallocs="05"/>
<HEAPSTAT handle="340000" numallocs="05"/>
</STACKSTATS>
<FRAME num="0" dll="aaa.exe" function="" filename="" line="" addr="0x407a72" offset="0x00007A72"/>
<FRAME num="1" dll="aaa.exe" function="" filename="" line="" addr="0x402ff2" offset="0x00002FF2"/>
<FRAME num="2" dll="aaa.exe" function="" filename="" line="" addr="0x402df9" offset="0x00002DF9"/>
<FRAME num="3" dll="aaa.exe" function="" filename="" line="" addr="0x402dd6" offset="0x00002DD6"/>
<FRAME num="4" dll="aaa.exe" function="" filename="" line="" addr="0x40112f" offset="0x0000112F"/>
<FRAME num="5" dll="aaa.exe" function="" filename="" line="" addr="0x401038" offset="0x00001038"/>
<FRAME num="6" dll="aaa.exe" function="" filename="" line="" addr="0x401269" offset="0x00001269"/>
<FRAME num="7" dll="KERNEL32.dll" function="GetSortTablesFileInfo" offset="0xC" filename="" line="" addr="0x7C5989D5"/>
<STACKID>00524008</STACKID>
</STACK>
</LEAKS>
其中numallocs是分配的次数,size是每次分配的大小,frame则是leak的时候的call stack
这里的stack只显示了binary,是因为symbol没有配好
把对应的pdb文件路径加到[Tools]-[Option]-Symbol search path,就能得到
<LEAKS ver="1.25.28.2201">
<STACK numallocs="06" size="048" totalsize="0288">
<STACKSTATS>
<SIZESTAT size="048" numallocs="06"/>
<HEAPSTAT handle="340000" numallocs="06"/>
</STACKSTATS>
<FRAME num="0" dll="aaa.exe" function="_heap_alloc_base" offset="0xC2" filename="malloc.c" line="200" addr="0x407A72"/>
<FRAME num="1" dll="aaa.exe" function="_heap_alloc_dbg" offset="0x1A2" filename="dbgheap.c" line="378" addr="0x402FF2"/>
<FRAME num="2" dll="aaa.exe" function="_nh_malloc_dbg" offset="0x19" filename="dbgheap.c" line="248" addr="0x402DF9"/>
<FRAME num="3" dll="aaa.exe" function="_nh_malloc" offset="0x16" filename="dbgheap.c" line="197" addr="0x402DD6"/>
<FRAME num="4" dll="aaa.exe" function="operator new" offset="0xF" filename="new.cpp" line="24" addr="0x40112F"/>
<FRAME num="5" dll="aaa.exe" function="main" offset="0x28" filename="D:/Test/aaa/test.cpp" line="8" addr="0x401038"/>
<FRAME num="6" dll="aaa.exe" function="mainCRTStartup" offset="0xE9" filename="crt0.c" line="206" addr="0x401269"/>
<STACKID>00524008</STACKID>
</STACK>
</LEAKS>
<STACK numallocs="06" size="048" totalsize="0288">
<STACKSTATS>
<SIZESTAT size="048" numallocs="06"/>
<HEAPSTAT handle="340000" numallocs="06"/>
</STACKSTATS>
<FRAME num="0" dll="aaa.exe" function="_heap_alloc_base" offset="0xC2" filename="malloc.c" line="200" addr="0x407A72"/>
<FRAME num="1" dll="aaa.exe" function="_heap_alloc_dbg" offset="0x1A2" filename="dbgheap.c" line="378" addr="0x402FF2"/>
<FRAME num="2" dll="aaa.exe" function="_nh_malloc_dbg" offset="0x19" filename="dbgheap.c" line="248" addr="0x402DF9"/>
<FRAME num="3" dll="aaa.exe" function="_nh_malloc" offset="0x16" filename="dbgheap.c" line="197" addr="0x402DD6"/>
<FRAME num="4" dll="aaa.exe" function="operator new" offset="0xF" filename="new.cpp" line="24" addr="0x40112F"/>
<FRAME num="5" dll="aaa.exe" function="main" offset="0x28" filename="D:/Test/aaa/test.cpp" line="8" addr="0x401038"/>
<FRAME num="6" dll="aaa.exe" function="mainCRTStartup" offset="0xE9" filename="crt0.c" line="206" addr="0x401269"/>
<STACKID>00524008</STACKID>
</STACK>
</LEAKS>
由test.cpp line 8引起的memory leak.
另外,以上leakdiag生成的log信息可以用LDParser来分析。
- 内存泄露检测工具LeakDiag的使用 .
- 内存泄露检测工具[VLD, LeakDiag]
- 内存泄露检测工具[VLD, LeakDiag]
- 内存泄露检测工具[VLD, LeakDiag]
- 内存泄露检测工具[VLD, LeakDiag]
- window使用内存泄漏检测工具Leakdiag记录
- 内存泄露检测工具使用
- C++内存泄露检测工具Visual Leak Detector的使用
- linux 下内存泄露检测工具valgrind的使用
- Ubuntu下内存泄露检测工具Valgrind的使用
- Windows 内存泄漏检测工具——LeakDiag
- Windows 内存泄漏检测工具——LeakDiag
- Qt5使用内存泄露检测工具—VLD
- Qt5使用内存泄露检测工具—VLD
- Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句(一)
- Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句(二)
- Linux下的内存泄露检测工具
- Linux下的内存泄露检测工具
- 为DataGrid的自带分页添加首页、尾页及状态功能
- glew, glee与 gl, glu, glut, glx, glext的区别和关系
- EL表达式
- Sysklogd 系统日志记录器使用指南
- Android中组件获取焦点与失去焦点颜色设置
- 内存泄露检测工具LeakDiag的使用 .
- cxf 客户端调用
- void MainWindow::createContextMenu()
- [算法] 矩阵相乘
- 配置sysklogd 接收远程系統日志
- 完成端口
- 重启adb
- 【Android自动化测试之Robotium】03. 当只有一个APK的时候使用robotium进行自动化测试
- Integer int 数据类型,封装类