青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

如何用WinDbg定位內存泄露?

Posted on 2009-03-27 21:38 S.l.e!ep.¢% 閱讀(6804) 評論(1)  編輯 收藏 引用 所屬分類: WinDbg
如何用WinDbg定位內存泄露?
?2008-08-04, 10:35 上午 Reply Quote
我用最近用VC在做一個應用程序,其中使用到了一些其他人員開發的DLL,當我在VC中運行該程序并退出時,輸出窗口中顯示很多Object Dump,雙擊這些信息也不能定位到我的源碼當中,我懷疑這些內存泄漏來自于我調用的DLL中,所以我向請教一下如何通過WinDbg來定位內存泄漏是發生在我的程序中還是DLL中?謝謝!
IP 地址: 已記錄?? 報告
Raymond 離線,最后訪問時間: 2009-3-11 12:55:32 Raymond

無等級
注冊: 2005-12-19
發 貼: 298
Re: 如何用WinDbg定位內存泄露?
?2008-08-04, 12:42 下午 Reply Quote
1)你能把你看到的轉儲信息(Dump)復制一些過來么?
2)如果你有《軟件調試》這本書,那么請閱讀一下第23章,特別是以下幾個小節:
23.7.2 DH和UMDH工具 668
23.7.3 定位內存泄漏 668
23.14 堆塊轉儲 700
23.15 泄漏轉儲 704
23.15.1 _CrtDumpMemoryLeaks 704
23.15.2 何時調用 705
23.15.3 定位導致泄漏的源代碼 706
IP 地址: 已記錄?? 報告
zxh65 離線,最后訪問時間: 2008-8-7 23:03:54 zxh65

無等級
注冊: 2008-08-03
發 貼: 4
Re: 如何用WinDbg定位內存泄露?
?2008-08-04, 13:05 下午 Reply Quote
謝謝Raymond!
因為轉儲信息比較多,我這里就貼一小部分!
{152} normal block at 0x01078320, 12 bytes long.
Data: 08 79 65 00 48 82 07 01 00 00 00 00
{151} normal block at 0x010782C0, 36 bytes long.
Data: CD CD CD CD CD CD CD CD 00 00 00 00 00 00 00 00
{150} normal block at 0x01078248, 56 bytes long.
Data: F4 77 65 00 00 00 00 00 68 71 07 01 90 3A 09 10
{149} normal block at 0x01077208, 4096 bytes long.
Data: 48 82 07 01 68 83 07 01 88 84 07 01 A8 85 07 01
{148} normal block at 0x010771C8, 4 bytes long.
Data: CD CD CD CD
{147} normal block at 0x01077168, 32 bytes long.
Data: 40 79 65 00 01 00 00 00 00 00 00 00 00 00 00 00
{146} normal block at 0x010770D0, 92 bytes long.
Data: 4C 76 65 00 D8 55 15 00 FF FF FF FF 00 00 00 00
{145} normal block at 0x01073B10, 8 bytes long.
Data: 10 3B 07 01 CD CD CD CD
{144} normal block at 0x01077070, 32 bytes long.
Data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{143} normal block at 0x01077018, 28 bytes long.
Data: 50 54 15 00 FF FF FF FF 00 00 00 00 00 00 00 00
{142} normal block at 0x01073A90, 64 bytes long.
Data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{141} normal block at 0x010739A0, 180 bytes long.
Data: C4 0B 13 10 90 3A 07 01 00 00 00 00 A4 79 1A 10
{138} normal block at 0x010737D8, 6 bytes long.
Data: 00 00 00 00 00 00
{137} normal block at 0x01073790, 8 bytes long.
Data: <H7> 48 37 07 01 CD CD CD CD
{136} normal block at 0x01073748, 8 bytes long.
Data: 90 37 07 01 18 5E 1A 10
{135} normal block at 0x010736E8, 32 bytes long.
Data: 20 79 12 10 A8 53 15 00 FF FF FF FF 00 00 00 00
{134} normal block at 0x010736A0, 12 bytes long.
Data: 90 37 07 01 01 00 00 00 A4 79 1A 10
最近正在看你的《軟件調試》,只是我才看到第四章,晚上回去我先看看23章!
另外,謝謝你寫《軟件調試》這本書,難得看到國人寫出這么好的書,我一定好好把書讀透,如果有什么疑問還要向你請教!
IP 地址: 已記錄?? 報告
Raymond 離線,最后訪問時間: 2009-3-11 12:55:32 Raymond

無等級
注冊: 2005-12-19
發 貼: 298
Re: 如何用WinDbg定位內存泄露?
?2008-08-04, 21:09 下午 Reply Quote
《軟件調試》的702頁介紹了堆塊轉儲的細節,取其中的一個堆塊為例:
{137} normal block at 0x01073790, 8 bytes long.
Data: <H7> 48 37 07 01 CD CD CD CD
137是堆塊的分配序號,堆塊的類型為普通堆塊,位置為0x01073790,用戶區長度為8字節。
Data后為用戶數據區的前16字節,因為這個數據區只有8字節,所以即所有8字節。<H7>是這8字節的ASCII碼顯示(其它6字節為不可顯示的ASCII碼)。其中的CD CD CD CD 是CRT在分配堆塊時自動填充的固定內容(《軟件調試》P696)。這說明這8個字節的堆塊,應用程序使用過前4個字節,后四個字節沒有使用過。

對于這樣的內存泄漏,有很多種辦法,你首先可以試一下23.13.1節介紹的內存分配序號斷點,也就是重新運行程序,在盡可能早的時候(比如入口),設置序號斷點(將_crtBreakAlloc變量設置為要中斷的序號,比如137),讓CRT分配到指定的內存塊時中斷。中斷下來后,可以根據棧回溯判斷是哪個模塊在分配內存,記錄后,再退出程序,如果這個堆塊仍出現在轉儲列表中,那么剛才那個模塊便值得懷疑了。

如果你有被懷疑的模塊源代碼,那么可以使用23.15.3節介紹的方法讓堆塊轉儲信息中包含源程序的文件名和行號,即下面的樣子:
C:\dig\dbg\author\code\chap23\MemLeak\MemLeak.cpp(22) : {74} normal block at 0x00371000, 20 bytes long.
Data: CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD




IP 地址: 已記錄?? 報告
zxh65 離線,最后訪問時間: 2008-8-7 23:03:54 zxh65

無等級
注冊: 2008-08-03
發 貼: 4
設置序號斷點還不能定位
?2008-08-05, 10:15 上午 Reply Quote
Raymond:感謝你的回復,我翻閱了23.13.1節,在程序入口處設置了序號斷點,但我的程序并沒有在序號斷點處中斷,我的判斷如下,不知道是否正確,還望指正!
我程序是使用lib文件隱式鏈接DLL的,當我在VC中按F11到程序入口的時候各DLL已經載入完成,如果序號所對應內存的分配的確是在某DLL的DllMain中的話此時再設置序號斷點已經晚了,所以最終序號斷點沒有中斷。不知道我這樣的分析是否正確?如果正確我該如何將序號斷點的設置再進一步提前到在DLL加載之前呢?
IP 地址: 已記錄?? 報告
neilhsu 離線,最后訪問時間: 2009-3-10 18:23:13 手語

無等級
注冊: 2008-06-06
發 貼: 60
Wink [;)] Re: 如何用WinDbg定位內存泄露?
?2008-08-05, 10:25 上午 Reply Quote

一般我用兩種方法:

1. 用Debug Diagnostic Tool的Leak監測分析功能,注意配置好PDB文件。

???DebugDiag 會生成完整的Leak Report。看看幫助很方便。

2. 用WinDBG的!heap擴展命令。注意要為你的程序打開Normal PageHeap。

???然后當內存出現明顯泄漏時用 !heap -l 命令分析內存。-l 參數使用類似Java/C#的Garbage Collection算法,這樣能找到大部分在程序中沒有被引用的HeapBlock。

???這是一個示例輸出:

0:011> !heap -l
Searching the memory for potential unreachable busy blocks.
......
Heap 017a0000
Scanning VM ...
Scanning references from 3586 busy blocks (0 MBytes) ...
Entry???????????User?????????Heap??????????? Segment????????Size? PrevSize? Unused??? Flags
-----------------------------------------------------------------------------
00253198? 002531a0? 00250000? 00250000??????? b8??????? 78??????? 14? busy extra
00253250? 00253258? 00250000? 00250000??????? 78??????? b8??????? 13? busy extra
00286a38? 00286a40? 00250000? 00250000??????? b8??????? b8??????? 15? busy extra
00286af0? 00286af8? 00250000? 00250000??????? b8??????? b8??????? 15? busy extra
00286ba8? 00286bb0? 00250000? 00250000??????? b8??????? b8??????? 15? busy extra
00286c60? 00286c68? 00250000? 00250000??????? b8??????? b8??????? 15? busy extra
00286d18? 00286d20? 00250000? 00250000??????? b8??????? b8??????? 15? busy extra
00286dd0? 00286dd8? 00250000? 00250000??????? b8??????? b8??????? 15? busy extra

???找到最常出現的Size值(這里是b8),一般就是持續泄漏的內存塊大小。隨便選一行,記下Entry地址(比如00286a3)。

???dt _DPH_BLOCK_INFORMATION 00286a3 + 8???//8 是HeapEntry結構的大小,跟在其后的就是PageHeap meta data,結構名是_DPH_BLOCK_INFORMATION.

???0:011> dt _DPH_BLOCK_INFORMATION 00286a3 + 8
ntdll!_DPH_BLOCK_INFORMATION
?? +0x000 StartStamp?????? : 0xabcdaaaa
?? +0x004 Heap???????????? : 0x80151000
?? +0x008 RequestedSize??? : 0x7b
?? +0x00c ActualSize?????? : 0xa3
?? +0x010 FreeQueue??????? : _LIST_ENTRY [ 0x2e - 0x0 ]
?? +0x010 TraceIndex?????? : 0x2e
?? +0x018 StackTrace?????? : 0x00357140
?? +0x01c EndStamp???????? : 0xdcbaaaaa

???看到StackTrace那行,這是相應的user mode stack trace database的地址。

0:011> dds 0x00357140
00357140? abcdaaaa
......
00357160? 7c949d18 ntdll!RtlAllocateHeapSlowly+0x44
00357164? 7c91b298 ntdll!RtlAllocateHeap+0xe64
00357168? 004017fe 06_DebugDiag_MemoryLeak!MyHeapAlloc+0x1e [g:\debugging101\projects\06_debugdiag_memoryleak\06_debugdiag_memoryleak\06_debugdiag_memoryleak.cpp @ 11]
0035716c? 0040182b 06_DebugDiag_MemoryLeak!WorkerThread+0x1b [g:\debugging101\projects\06_debugdiag_memoryleak\06_debugdiag_memoryleak\06_debugdiag_memoryleak.cpp @ 27]
00357170? 7c80b683 kernel32!BaseThreadStart+0x37

???這就是上次通過Heap Manager函數操作這個HeapBlock的StackTrace,一般也就是分配這個Block的地方。

???希望可以幫到你。


鴻鵠安知燕雀之志
IP 地址: 已記錄?? 報告
Raymond 離線,最后訪問時間: 2009-3-11 12:55:32 Raymond

無等級
注冊: 2005-12-19
發 貼: 298
Re: 如何用WinDbg定位內存泄露?
?2008-08-05, 12:48 下午 Reply Quote
1)如果你覺得main/winmain入口還不夠早,那么可以使用WinDBG,在進程的初始斷點命中后,啟用模塊加載事件(debug > event filters > load module),然后在每個CRT DLL加載后設置序號斷點。
2)被調試進程中可能有幾個CRT實例,應該修改所有實例的_crtBreakAlloc變量,才能保證不會遺漏。以myapp.exe為例,myapp內可能有一份靜態鏈接進來的CRT,即myapp!_crtBreakAlloc。而MSVCRT60.DLL這樣的模塊中也有CRT實例。

手語說的在Win32堆這一層次來分析也是可行的,而且把握更大,但是就要求你先要熟悉一下Win32堆的常識,《軟件調試》23章的前10節做了詳細的介紹。
IP 地址: 已記錄?? 報告
zxh65 離線,最后訪問時間: 2008-8-7 23:03:54 zxh65

無等級
注冊: 2008-08-03
發 貼: 4
Re: 如何用WinDbg定位內存泄露?
?2008-08-07, 10:15 上午 Reply Quote
To Raymond:
你的回復中我有兩點疑問,特再次請教!
1、在WinDbg中啟用模塊加載事件有兩個選項,一個是Execution,另一個是Continue。我試了一下,將Execution選項設為Enable時,重新在WinDbg我的程序在其加載每個DLL時都會中斷;而Continue選項無論設置哪個值都沒有明顯影響。我看了一下幫助,說這兩個選項分別用來改變中斷狀態(break status)和處理狀態(handling status),我不知道上述兩個狀態尤其是第二個狀態的作用是什么?
2、在WinDbg中如何設置序號斷點?
To 手語:
你提供的兩個方法我都還沒用過,我最近正在按照Raymond的提示在看《軟件調試》的相關章節,感謝你的幫助!
IP 地址: 已記錄?? 報告
Raymond 離線,最后訪問時間: 2009-3-11 12:55:32 Raymond

無等級
注冊: 2005-12-19
發 貼: 298
Re: 如何用WinDbg定位內存泄露?
?2008-08-07, 12:50 下午 Reply Quote
ZXH,
Continue選項只對異常類事件有意義(參見《軟件調試》30.9.3節,P48)。
WinDBG中可以直接使用ed命令來編輯_crtBreakAlloc變量(《軟件調試》P698),例如你要編輯靜態鏈接到myapp.exe中的CRT實例,那么便執行:ed myapp!__crtBreakAlloc 。

Feedback

# re: 如何用WinDbg定位內存泄露?   回復  更多評論   

2011-08-24 11:11 by sghcpt
To S.l.e!ep.¢%
我在網上看到你的提問關于“如何用WinDbg定位內存泄露? ”,我也遇到這樣的情況,我的程序運行一段時間會出現錯誤,但不知道是我的代碼有問題還是別人的dll庫有問,想請問你一下,你上面的問題處理好了嗎?是怎樣處理的?
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            香蕉尹人综合在线观看| 免费不卡视频| 亚洲茄子视频| 国产亚洲欧洲一区高清在线观看| 久久久久成人精品| 亚洲午夜一级| 欧美大色视频| 久久免费视频在线观看| 欧美在线免费一级片| 欧美一区视频在线| 亚洲欧美国产制服动漫| 亚洲一区在线观看免费观看电影高清| 在线观看视频一区二区| 亚洲国产99精品国自产| 亚洲人被黑人高潮完整版| 日韩视频不卡| 欧美在线三区| 亚洲黄色有码视频| 亚洲美女网站| 欧美在线亚洲综合一区| 美日韩丰满少妇在线观看| 欧美日韩中文在线| 奶水喷射视频一区| 亚洲国产美女| 一区二区三区视频在线 | 亚洲欧美日韩电影| 亚洲欧美日韩一区二区在线 | 国产亚洲精品久久久| 亚洲国产欧美精品| 这里是久久伊人| 久久蜜桃资源一区二区老牛 | 国产三级精品在线不卡| 一区精品久久| 欧美伊人影院| 亚洲视频导航| 国产精品v欧美精品v日韩精品| 国语自产精品视频在线看8查询8| 日韩视频不卡中文| 欧美国产视频在线| 久久爱www久久做| 国产精品欧美日韩一区| 亚洲免费观看| 在线亚洲免费| 一区二区三区成人| 欧美日韩理论| 午夜久久99| 午夜久久久久久久久久一区二区| 欧美激情bt| 亚洲性视频h| 亚洲综合三区| 激情亚洲成人| 狠色狠色综合久久| 另类综合日韩欧美亚洲| 久久九九免费视频| 亚洲激情av在线| 夜夜嗨av一区二区三区四区 | 欧美顶级大胆免费视频| 裸体女人亚洲精品一区| 一本到高清视频免费精品| 亚洲精品看片| 亚洲第一精品福利| 一区二区免费在线观看| 国产精品私拍pans大尺度在线| 久久精品亚洲一区| 欧美人体xx| 免费欧美电影| 国产精品日韩精品欧美在线| 欧美激情综合五月色丁香| 亚洲欧美中文字幕| 欧美暴力喷水在线| 蜜桃久久av一区| 国产一区二区成人| 亚洲午夜国产成人av电影男同| 亚洲激情在线播放| 久久婷婷人人澡人人喊人人爽 | 欧美肥婆在线| 久久婷婷国产麻豆91天堂| 国产精品区一区| 在线中文字幕日韩| 亚洲高清在线视频| 久久久亚洲影院你懂的| 久久久人成影片一区二区三区观看| 欧美日韩高清在线播放| 91久久嫩草影院一区二区| 久久久久九九视频| 欧美一区二区三区久久精品| 欧美激情性爽国产精品17p| 男女激情久久| 亚洲国产精品一区二区第一页 | 亚洲九九精品| 中文在线一区| 国产伦理精品不卡| 性色av一区二区三区| 久久中文在线| 一区二区三区欧美在线| 国产美女一区| 欧美色偷偷大香| 免费观看不卡av| 久久国产黑丝| 欧美一区二区三区成人| 亚洲日韩欧美视频| 久久综合亚州| 久久精品色图| 欧美一级理论片| 亚洲你懂的在线视频| 亚洲欧洲日产国产网站| 国产亚洲综合性久久久影院| 欧美日韩不卡一区| 欧美www视频| 欧美大片网址| 久久久久久高潮国产精品视| 亚洲一区二区黄| 亚洲清纯自拍| 亚洲日本免费| 亚洲国产日韩欧美在线99| 中文精品在线| 国产性色一区二区| 99精品久久久| 欧美日韩一区二区精品| 亚洲精品小视频在线观看| 日韩午夜av| 亚洲伦理一区| 久久嫩草精品久久久精品| 免费观看在线综合| 亚洲日本中文字幕区| 久久亚洲影音av资源网| 亚洲人成网站777色婷婷| 亚洲一区二区三区久久| 欧美日韩亚洲在线| 久久久久久穴| 亚洲欧美日韩在线| 亚洲丁香婷深爱综合| 欧美日韩视频在线一区二区观看视频| 午夜精品福利一区二区蜜股av| 亚洲第一精品久久忘忧草社区| 欧美三级第一页| 久久综合九色综合久99| 性欧美激情精品| 亚洲五月婷婷| 欧美高清不卡在线| 久久久久9999亚洲精品| 99热免费精品| 亚洲少妇一区| 亚洲午夜视频在线观看| 欧美视频中文字幕| 欧美日韩成人在线观看| 久久躁日日躁aaaaxxxx| 亚洲综合成人在线| 亚洲自拍都市欧美小说| 一二美女精品欧洲| 日韩视频在线观看一区二区| 欧美夫妇交换俱乐部在线观看| 久久综合激情| 免费在线亚洲| 亚洲人线精品午夜| 在线视频你懂得一区| 亚洲免费婷婷| 久久人人爽人人爽爽久久| 欧美淫片网站| 欧美激情偷拍| 狠狠色狠狠色综合人人| 午夜国产不卡在线观看视频| 国产美女精品视频免费观看| 国产精品毛片| 国产在线观看一区| 欧美日韩免费观看一区三区| 欧美日韩hd| 激情成人av在线| 国产精品美女久久久浪潮软件| 国产日韩欧美黄色| 亚洲欧洲日产国码二区| 亚洲一区二区三区精品动漫| 午夜在线观看免费一区| 麻豆精品一区二区综合av| 欧美激情一区三区| 久久精品99无色码中文字幕 | 亚洲欧洲精品一区二区精品久久久 | 国产精品电影观看| 国产一区二区精品| 一本色道久久综合一区| 麻豆av一区二区三区| 欧美日韩你懂的| 有码中文亚洲精品| 欧美主播一区二区三区| 99精品国产一区二区青青牛奶| 欧美一区二区大片| 欧美日韩在线三区| 一本色道久久加勒比精品| 亚洲国产婷婷香蕉久久久久久99| 国语精品一区| 欧美暴力喷水在线| 老司机精品视频一区二区三区| 国产亚洲综合精品| 久久精品一本| 久久伊人亚洲| 亚洲一区亚洲二区| 欧美一区二区三区免费看 | 亚洲日本aⅴ片在线观看香蕉| 久久精品免费看| 亚洲免费影院|