您的位置:首页 > 其它

VS2010检查内存泄漏 LeakDiag

2012-06-07 10:14 113 查看

http://www.codeproject.com/Articles/108529/LeakDiag-An-Effective-Memory-Leak-Analysis-Tool http://leakdiag.software.informer.com/download/
【转】VS2010检查内存泄漏 LeakDiag

LeakDiag是微软一款检测memory leak的工具,使用比较简单

首先去下载一个

安装好,默认是在c:\leakdiag



然后写一个测试程序来测试

#include <stdio.h>

#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>

其中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>

由test.cpp line 8引起的memory leak.

LeakDiag可以用以检测无论是简单exe程序还是Windows Service的内存泄漏问题。不需要停止程序,就可以进行对程序的内存监测。

LeakDiag形成的LOG文件中,包含了分配了内存,但是在进行LOG输出(快照)的时候没有进行释放的调用栈情况。LeakDiag在start后对进程进行实时的进行监测,在输出LOG的时候,进行结果形成,可以设置定时的输出。

使用LeakDiag为了保证正确的解析调用栈,需要设置对程序使用的符号信息进行搜索的路径。包括public symbol path和本地程序的符号信息,public symbol path可以设置成:

srv*c:\symcache* http://msdl.microsoft.com/download/symbols
其是微软提供的底层DLL、API的符号信息。系统修补程序打包在修补包中,有些则有独立的下载。将本地程序的符号信息(即PDB(Program Debug Database,程序调试数据库)文件的目录),也请添加到符号搜索路径中。

对于大规模程序,勾选Resolve symbols when logging,不是很好的选择。可以在LOG完成后,再进行符号解析。因为如果勾选,在形成LOG的时候,对于大型软件需要进行大量的符号解析。

#1℃vc/mfc
浏览(109)评论转载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: