強大的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


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: