强大的windbg定位内存泄露,两句命令搞定!
1.简单配置
在windbg程序目录下有个gflags.exe,运行后设置:
运行CMD.EXE,输入"D:\Debugging Tools for Windows (x86)\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值。
参考:http://support.citrix.com/article/CTX106970
我起初的时候也设置失败了,后来发现是360的一个服务禁止了对上述注册表的操作,卸载之后就行了。
2.关于符号
如果符号不全或者不正确,也不能使用该方法侦测内存泄露的位置。如果真机系统符号不全(如xp sp3),可以在虚拟机中侦测。
3.具体实例
例如内存泄露:
Detected memory leaks!
Dumping objects ->
e:\vs工程\tests\testsdlg.cpp(101) : {118} normal block at 0x003BBAD8, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
!heap -x 0x003BBAD8
Entry User Heap Segment Size PrevSize Unused Flags
-----------------------------------------------------------------------------
003bbab0 003bbab8 003b0000 003b0640 a0 17f0 18 busy extra fill
!heap -p -a 003bbab0
address 003bbab0 found in
_HEAP @ 3b0000
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
003bbab0 0014 0000 [07] 003bbab8 00088 - (busy)
Trace: 0357
7c98eed2 ntdll!RtlDebugAllocateHeap+0x000000e1
7c96b394 ntdll!RtlAllocateHeapSlowly+0x00000044
7c938f21 ntdll!RtlAllocateHeap+0x00000e64
1024db9c MSVCR80D!malloc_base+0x000000ec
1020faa5 MSVCR80D!malloc_dbg+0x000002d5
1020f839 MSVCR80D!malloc_dbg+0x00000069
1020f7ef MSVCR80D!malloc_dbg+0x0000001f
78332934 MFC80UD+0x00052934
783329b8 MFC80UD+0x000529b8
78332396 MFC80UD+0x00052396
4129ae tests!CtestsDlg::OnInitDialog+0x0000013e
7839bfae MFC80UD+0x000bbfae
77d18734 USER32!InternalCallWinProc+0x00000028
77d2413c USER32!UserCallDlgProcCheckWow+0x000000f0
77d23b30 USER32!DefDlgProcWorker+0x000000a8
77d23d5c USER32!DefDlgProcW+0x00000022
77d18734 USER32!InternalCallWinProc+0x00000028
77d18816 USER32!UserCallWinProcCheckWow+0x00000150
77d2a013 USER32!CallWindowProcAorW+0x00000098
77d2a039 USER32!CallWindowProcW+0x0000001b
7835e302 MFC80UD+0x0007e302
7835cb1b MFC80UD+0x0007cb1b
7839d393 MFC80UD+0x000bd393
7835fbf7 MFC80UD+0x0007fbf7
7835f3b0 MFC80UD+0x0007f3b0
7835c9be MFC80UD+0x0007c9be
7835ceb4 MFC80UD+0x0007ceb4
78358979 MFC80UD+0x00078979
77d18734 USER32!InternalCallWinProc+0x00000028
77d18816 USER32!UserCallWinProcCheckWow+0x00000150
77d2927b USER32!SendMessageWorker+0x000004a5
77d2651a USER32!InternalCreateDialog+0x000009df
其中4129ae 地址就是分配内存的地方,从而导致的内存泄露。
http://support.microsoft.com/kb/268343/zh-cn