使用WinDBG调试内存泄露的问题

参考了http://blog.csdn.net/antclub/article/details/7488868

1.先运行Windbg安装目录下的gflags.exe,Image File,Image填exe名字,不要全路径,选上Create user mode stack trace database;

2.在Windbg中调试模式运行程序,在退出时显示:

e:\vs工程\tests\testsdlg.cpp(101) : {125} normal block at 0x003B9578, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

3.执行!heap -x 命令

0:000> !heap -x 0x003B9578
Entry User Heap Segment Size PrevSize Unused Flags
-----------------------------------------------------------------------------
003b9550 003b9558 003b0000 003b0640 a0 808 18 busy extra fill

4.执行!heap -p -a 003b9550

二。没有打印"normal block at 0x003B9578"的情况,要使用umdh,在windbg的安装目录下有

1.设置好符号变量路径:echo %_NT_SYMBOL_PATH%
C:\WINDOWS\Symbols\dll;E:\Symbols;http://192.168.74.55/sym;http://msdl.microsoft
.com/download/symbols

2.建一个内存快照:umdh.exe -p:2728 -f:c:\1.log

3.再建一个内存快照:umdh.exe -p:2728 -f:c:\2.log

4.比较两个内存快照:umdh -d c:\1.log c:\2.log >c:\3.log

前面是+号的表示增加的,如

+ 8216 ( 8216 - 0) 1 allocs BackTrace65
+ 1 ( 1 - 0) BackTrace65 allocations

前面是-号的表示是减少的

- 8216 ( 0 - 8216) 0 allocs BackTrace61
- 1 ( 0 - 1) BackTrace61 allocations

 

之中遇到了执行!heap -x 地址时候出现ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\kernel32.dll -

查资料得知:

!heap这个扩展命令需要系统DLL(NTDLL和KERNEL32.DLL)的符号,上面的提示是说缺少ntdll!_HEAP_ENTRY(描述堆块的基本数据结构,见《软件调试》P658)这个结构的符号。
解决的方法是连接符号服务器(P935),让WinDBG自动下载系统文件的符号,也就是在连着互联网的情况下执行下面的两条命令:
.symfix c:\symbols (设置符号服务器,并把c:\symbols作为下游符号库)
.reload (重新加载符号)

http://www.cnblogs.com/SkyMouse/archive/2012/07/05/2578553.html

windbg调试内存泄漏

首先使用windbg工具gflags.exe设置内存启动跟踪内存泄露进程的user stack

启动方法就是运行下面指令gflags.exe /i test.exe +ust

等价于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options,命令“gflags.exe /i test.exe +ust”实际上就是在该路径下创建一个子键“test.exe”并创建一个名为GlobalFlag内容为0x00001000的REG_DWORD值。

使用windbg加载test.exe,运行关闭时windbg中会提示内存泄露

?
normal block at 0x026A5F98, 4000 bytes long .
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.

可以发现地址0x026A5F98就是内存泄漏的地址泄漏4000个字节

通过!heap命令对该地址进行分析可以发现具体的调用堆栈

?
0:000> !heap -p -a 0x026A5F98
     address 026a5f98 found in
     _HEAP @ 14f0000
       HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
         026a5f60 01fc 0000  [00]   026a5f78    00fc4 - (busy)
         77a1b234 ntdll!RtlAllocateHeap+0x00000274
         584d7743 MSVCR100D!_heap_alloc_base+0x00000053
         584e5d8c MSVCR100D!_heap_alloc_dbg_impl+0x000001fc
         584e5b2f MSVCR100D!_nh_malloc_dbg_impl+0x0000001f
         584e5adc MSVCR100D!_nh_malloc_dbg+0x0000002c
         584e5a91 MSVCR100D!_malloc_dbg+0x00000021
         58694dd6 mfc100ud!operator new +0x00000026
         58694e6a mfc100ud!operator new []+0x0000001a
         58694768 mfc100ud!operator new []+0x00000018
*** WARNING: Unable to verify checksum for SendMsgEx.exe
         2a3c25 SendMsgEx!CSendMsgExDlg::Thread1Proc+0x00000055
         767c1174 kernel32!BaseThreadInitThunk+0x0000000e
         779fb3f5 ntdll!__RtlUserThreadStart+0x00000070
         779fb3c8 ntdll!_RtlUserThreadStart+0x0000001b

可以发现内存泄漏的地址在CSendMsgExDlg::Thread1Proc这个地址里面调用了new[]导致内存泄漏

?
DWORD WINAPI CSendMsgExDlg::Thread1Proc(__in  LPVOID lpParameter)
{
     INT *pVal = new INT [1000];
         //..................
}

如此即可发现导致内存泄漏的原因和地址!



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值