1. 下载Debug Tools for Windows:http://www.microsoft.com/whdc/devtools/debugging/default.mspx (里边的UMDH就是用来查内存泄漏的),安装,并设置安装路径为环境变量(便于命令行启动)
2. 写测试程序test.exe,比如搞个线程不断的分配内存,不要太猛太暴力,把你机器搞的冒烟了,妈妈会骂的~
3. 设置符号集(Symbols file, 即.pdb文件)路径为_NT_SYMBOL_PATH环境变量,可以直接指定测试程序的生成目录(vc生成的pdb文件与可执行文件是放一块的)
4. 启动测试程序的堆跟踪:gflag -i test.exe +ust, gflag也是Debug Tools for Windows里边的一个工具,用以启动或关闭对一个进程的高级调试和跟踪,会记在注册表里的
5. 启动测试程序test.exe, 记录其进程pid编号,可以用任务管理器看,也可以执行命令:tlist | findstr test.exe,比如:1884
6. 开始记录初始log, 执行命令: umdh -p:1884 -f:1884old.log, 这样就把泄漏操作之前的堆状态记录下来;
7. 继续执行测试程序,让他产生泄漏
8. 开始记录结束log,执行命令: umdh -p:1884 -f:1884new.log, 这样就把泄漏操作之后的堆状态记录下来;
9. 执行比较命令:umdh -d 1884old.log 1884new.log > cmp1884.txt, 将输出结果写到cmp1884.txt文件中。
如果pdb文件路径配置正确,cmp1884.txt中会记录类似如下的信息:
===================================================================
+ 10600 ( 10600 - 0) 10 allocs BackTrace4A
+ 10 ( 10 - 0) BackTrace4A allocations
ntdll!RtlpNtMakeTemporaryKey+000074CE
ntdll!LdrAlternateResourcesEnabled+00002AFD
ntdll!RtlDosSearchPath_Ustr+00000310
MSVCR90D!malloc_base+000000FE
MSVCR90D!malloc_dbg+00000306
MSVCR90D!malloc_dbg+000000BF
MSVCR90D!malloc_dbg+0000006C
MSVCR90D!malloc+0000001B
MSVCR90D!operator new+00000011
TestUMDH!ReceivingThrd+00000040 (e:\code\testumdh\test.cpp, 27)
MSVCR90D!beginthreadex+00000243
MSVCR90D!beginthreadex+000001D9
kernel32!GetModuleFileNameA+000001BA
====================================================================
这个就是分配内存时候的调用栈了,同时也指出了内存分配具体的函数名和代码行,剩下的就是体力活了
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Umdh 是 Debugging Tools for Windows 里面的一个工具, 可以从下面链接下载http://www.microsoft.com/whdc/devtools/debugging/default.mspx. UMDH主要通过分析比较进程的Heap Stack trace信息来发现内存泄露的。
Total increase == 5320
2.接下来就是查找对应的BackTrace,例如上面的意思是说在BackTrace00053处内存增加了5320个字节,在BackTrace00053你将能找到内存泄露处对应的CallStack。
3.接下来看一下BackTrace00053究竟有什么东西,找到第二个日志文件,在这里就是1234new.log,搜索BackTrace00053, 如果你的Symbol File Path配置正确的话,在BackTrace00053你会发现有类似如下信息: