![內(nèi)存溢出的VisualleakDetector的用法_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/5/a2038634-b263-4757-b394-4f333b4fd2c6/a2038634-b263-4757-b394-4f333b4fd2c61.gif)
![內(nèi)存溢出的VisualleakDetector的用法_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/5/a2038634-b263-4757-b394-4f333b4fd2c6/a2038634-b263-4757-b394-4f333b4fd2c62.gif)
![內(nèi)存溢出的VisualleakDetector的用法_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/5/a2038634-b263-4757-b394-4f333b4fd2c6/a2038634-b263-4757-b394-4f333b4fd2c63.gif)
![內(nèi)存溢出的VisualleakDetector的用法_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/5/a2038634-b263-4757-b394-4f333b4fd2c6/a2038634-b263-4757-b394-4f333b4fd2c64.gif)
![內(nèi)存溢出的VisualleakDetector的用法_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/5/a2038634-b263-4757-b394-4f333b4fd2c6/a2038634-b263-4757-b394-4f333b4fd2c65.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VLD(Visual LeakDetector)內(nèi)存泄露庫(kù)的使用分類: Windows 編程2012-09-27 08:09 12300 人閱讀 評(píng)論 收藏舉報(bào) vld目錄(?)【+VLD簡(jiǎn)介由于C/C+語(yǔ)言沒有所謂的垃圾收集器,內(nèi)存的分配和釋放都需要程序員自 己來(lái)控制,這會(huì)給C/C+程序員帶來(lái)一定的困難。當(dāng)您的程序越來(lái)越復(fù)雜時(shí),它 的內(nèi)存管理也會(huì)變得越來(lái)越困難。內(nèi)存泄漏、內(nèi)存越界是最常見的內(nèi)存問(wèn)題之一。內(nèi)存泄漏如果不是很嚴(yán)重的話,在短時(shí)間內(nèi)對(duì)程序不會(huì)造成太大的影響,而且在進(jìn)程終止的時(shí)候,所有分配的內(nèi)存都會(huì)釋放掉。但是對(duì)于長(zhǎng)時(shí)間運(yùn)行的程序, 其破壞力是驚人的,從性能下降到內(nèi)存耗盡,甚至?xí)绊懙?/p>
2、其它程序的正常運(yùn)行。此外,內(nèi)存問(wèn)題存在一個(gè)共同的特點(diǎn),它本身并不會(huì)有很明顯的現(xiàn)象,當(dāng)有 異常出現(xiàn)時(shí)就很難檢查問(wèn)題的原因所在,這給調(diào)試內(nèi)存問(wèn)題帶來(lái)了很大的難度。VLD是一款用于VisualC+的免費(fèi)內(nèi)存泄漏檢查工具??梢栽?網(wǎng)站上找到,相比其它的內(nèi)存泄漏哦給你根據(jù), 他在檢查內(nèi)存泄漏的同事,還具 有如下特點(diǎn):1 )可以得到內(nèi)存泄漏點(diǎn)的調(diào)用堆棧,如果可以的話,還可以得到其所在的文件及行號(hào);2 )可以得到泄漏內(nèi)存的完整數(shù)據(jù);3 )惡意設(shè)置內(nèi)存泄漏報(bào)告的級(jí)別;4 )它以動(dòng)態(tài)庫(kù)的形式提供,無(wú)需編譯源代碼,只需要很小的改動(dòng)程序;5 )源代碼使用GNU許可發(fā)布,并有詳細(xì)的文檔及其注釋。從使用的角度講,VLD
3、簡(jiǎn)單易用,對(duì)于使用者自己的代碼中唯一需要修改的 地方是#include VLD的頭文件后正常運(yùn)行自己的程序就可以發(fā)現(xiàn)內(nèi)存問(wèn)題。從 研究角度上講,如果輸入到 VLD源代碼,可以學(xué)習(xí)到堆內(nèi)存分片與釋放的原理、 內(nèi)存檢查的原理機(jī)器內(nèi)存操作的常用技巧等。VLD使 用VLD 網(wǎng)址: nhance d-Memory-Leak-Detectio下載 Visual LeakDetector ,當(dāng)前版本 223,打開 Visual C+ IDE 的"工 具"-"選項(xiàng)"-"項(xiàng)目和解決方案"-"VC+目錄",在"包含文件&qu
4、ot;中增加VLD的頭 文件路徑"inelude" 路徑,在"庫(kù)文件"增加VLD庫(kù)文件的"libWin32" 路徑,此 外動(dòng)態(tài)庫(kù)的"binWin32"路徑在安裝時(shí)已經(jīng)添加到環(huán)境變量里面了,若是未添加,則需要手動(dòng)拷貝"binWin32"下的文件到可執(zhí)行文件所在的目錄中(拷貝的文件 有 dbghelp.dll/Microsoft.DTfW.DHL.manifest/vld_x86.dll/vld.ini)。接下來(lái)需要將VLD加入到自己的代碼中。方法很簡(jiǎn)單,只要在包含入口函數(shù) 的.cpp文件中包含vl
5、d.h就可以。如果這個(gè)cpp文件中包含了 stdafx.h,則將 包含vld.h的語(yǔ)句放在stdafx.h的包含語(yǔ)句之后,否則放在最前面。示例程序:#include<vld.h>/ 包含 VLD的頭文件#i nclude<stdlib.h>#i nclude<stdio.h>void f()int *p = new int(0x12345678);prin tf("p=%08x, ", p);int main()f();return 0;注:VLD只能在Windows下使用,在包含vld.h頭文件時(shí)增加預(yù)編譯選項(xiàng)。 注:在 Release
6、 模式下,不會(huì)鏈接 VisualLeak Detector 。注:Visual LeakDetector有一些配置項(xiàng),可以設(shè)置內(nèi)存泄露報(bào)告的保存地 (文件、調(diào)試器),拷貝"Visual Leak Detector"路徑下的vld.ini文件到執(zhí)行文件所在的目錄下(在IDE運(yùn)行的話,則需要拷貝到工程目錄下),修改以下 項(xiàng):ReportFile =.memory_leak_report.txtReportTo = bothVLD工具原理下面我們來(lái)看看 VLD是如何工作的。在VisualC+中內(nèi)置工具CRTDebugHeap 工具,在使用Debug版本分配內(nèi)存時(shí),它會(huì)在內(nèi)存塊中記
7、錄分配該內(nèi)存的文件名 和行號(hào)。當(dāng)程序退出時(shí) CRT會(huì)在main函數(shù)返回時(shí)做一些清理工作,此時(shí)檢查調(diào)試堆內(nèi)存,如果仍然有內(nèi)存沒釋放,則一定存在內(nèi)存泄漏問(wèn)題。從這些沒有被釋 放的內(nèi)存塊的頭中可以得到文件名和行號(hào)。這種靜態(tài)的方法可以檢查出內(nèi)存泄漏,但是不知道泄漏究竟是怎么發(fā)生的,也不知道該內(nèi)存分配語(yǔ)句是如何被執(zhí)行到的, 想要了解這些必須對(duì)內(nèi)存分配過(guò)程進(jìn)行動(dòng)態(tài)跟蹤。VLD就是這樣做的,在每次內(nèi)存分配的時(shí)候記錄其上下文,當(dāng)程序退出時(shí)對(duì)檢測(cè)到的內(nèi)存泄漏查找其上下文信 息,并轉(zhuǎn)換成報(bào)告輸出到Output中。初始化VLD 要記錄每次的內(nèi)存分配,它通過(guò) Windows提供的分配鉤子allocation hook
8、s來(lái)監(jiān)視調(diào)試堆內(nèi)存的分配。它是一個(gè)用戶自定義的回調(diào)函數(shù),在每次從堆 中分配內(nèi)存之前被調(diào)用,在初始化是VLD使用_CrtSetAllocation注冊(cè)這個(gè)鉤子函數(shù)。全局變量在程序初始化時(shí)就初始化,如果將VLD作為一個(gè)全局變量就可以與程序 一起啟動(dòng),但是C/C+并沒有約定全局變量初始化的順序,如果其它全局變量的 構(gòu)造函數(shù)中有內(nèi)存分配則可能無(wú)法檢測(cè)到。因此,VLD使用C/C+提供的#pragmaini t_seg 來(lái)減少其它全局變量在它之前進(jìn)行初始化。根據(jù) #pragma init_seg 的 定義,全局變量初始化分為3個(gè)階段,首先是compiler階段,一般進(jìn)行C語(yǔ)言 運(yùn)行時(shí)庫(kù)的初始化;然后是li
9、b段,一般用于第三方類庫(kù)的初始化扽;最后是 user段,大部分的初始化都在這個(gè)階段進(jìn)行。記錄內(nèi)存分配一個(gè)內(nèi)存分配鉤子函數(shù)需要具有如下的定義:int AllocHook(i nt allocType, void*userData, size_t size,i nt blockType, long requestNumber, onst un sig ned char*file name, i nt lin eNumber);該函數(shù)需要在VLD初始化時(shí)被注冊(cè),每次從堆中分配內(nèi)存前被調(diào)用,它需要 處理的事情就是記錄下此時(shí)的調(diào)用堆棧和此時(shí)堆內(nèi)存分配的唯一標(biāo)識(shí)requestNumber。得到當(dāng)前堆棧的二
10、進(jìn)制表示并不是很復(fù)雜的事情, 但是因?yàn)椴煌捏w系結(jié)構(gòu)、不 同的編譯器、不同的操作系統(tǒng)所產(chǎn)生的堆棧內(nèi)容是不一樣的,要解釋堆棧并得到 整個(gè)函數(shù)的調(diào)用過(guò)程比較復(fù)雜。不過(guò)Windows提供了一個(gè)StackWalk64函數(shù)可以 獲得堆棧的內(nèi)容。VLD 是常用的C/C+內(nèi)存泄漏檢查工具,可以在ViusalC+中使用,在Viusal Studio 2008和2010中使用需要注意兩點(diǎn):1) 版本問(wèn)題:VLD已經(jīng)更新到2.2版本,修正了許多bug,而且在2010版本下工作良好,VisualC+ 6.0推薦使用1.0版本,1.9b版本不是很穩(wěn)定不建 議使用,2.2版本的下載網(wǎng)址為 .2 )設(shè)置變化:VC+Dir
11、ectories設(shè)置已經(jīng)變化位置,在 2010中設(shè)置過(guò)程如下:View | Other Win dow | Property Man agerGo to "VC+ Directories" setti ngsSet in clude folder pathSet lib folder path點(diǎn)OK我們就設(shè)置好了 include和lib目錄問(wèn)題 1: VLD 1.9在vista下使用vid的使用,總是出現(xiàn)錯(cuò)誤無(wú)法正常工作,后來(lái)經(jīng)過(guò)搜索, 在 上的評(píng)論中找到了解決的方法:評(píng)論“ Solution forrunning 1.9 beta on Visual Studio 200
12、8 with Vista 給出了解決方法: 評(píng)論1:VLD keptcrashi ng whe n trying to use 1.9g beta on Win dows Vista, visual studio 2008. Itried all the suggestions on here and nothing worked. But I fin ally figured itout.whe n you make a project in visual C+ 2008,it sets some stra nge adva need Lin ker properties that caus
13、e VLD to crash:I cha ngedL in ker->Adva nced->Ra ndomized Base Address from En able Image Ran domizatio n(/DYNAMICBASE) to Disable Image Ra ndomizati on (/DYNAMICBASE:NO)Then I changed Linker->Advanced->DataExecutionPrevention from Image iscompatible with DEP (/NXCOMPAT) to DefaultAnd no
14、w it works perfectlyPlease let me know if this helped you!It'll make me feel better for spe nding a whole day trying to get it work ing!-Nadav 評(píng)論2:The base address randomization seemsto benot necessary. Just disable DEP.大致的意思是說(shuō), 只需要禁用 DEP即可,在工程的“屬性”-> “鏈接器”-> “高級(jí)”-> 數(shù)據(jù)執(zhí)行保護(hù)(DEP,設(shè)為“默 認(rèn)” (
15、default )或者“映像與DEP不兼容(/NXCOMPAT:NO)即可。(修改后 好像不可用)。注:這個(gè)選項(xiàng)只針對(duì) Vista有效! !問(wèn)題 2: VLD 223在項(xiàng)目中使用了 visual leak detector,調(diào)試時(shí)程序無(wú)法啟動(dòng)報(bào)錯(cuò)“應(yīng)用程序正常啟動(dòng)失敗(0xc0150002) ”。解決流程:查看vs輸出信息最后一條是:Theprogram '3980 MobileSig nalA nalyzer.exe: Native' has exited with code-1072365566 (0xc0150002)在網(wǎng)上多方查找有:http:/blog.csd n.n
16、 et/evilswords/article/details/5698851 http:/blog.csd n.n et/brook0344/article/details/6685724這兩篇有解決辦法,就是把 VLD中的這兩個(gè)復(fù)制到執(zhí)行文件夾下就正常了Microsoft.VC90.CRT.ma nifestMicrosoft.DTfW.DHL.ma nifest產(chǎn)生原因:VC2003、VC2005 VC2008及其后續(xù)版本,對(duì)底層最基本的 CRT MFC ATL庫(kù)都進(jìn)行了重構(gòu),為了避免不同版本的庫(kù)引起沖突,重構(gòu)后的庫(kù)文件一般放在C:/windows/WinSxS文件夾中,并用特定的文件夾/文件名稱進(jìn)行標(biāo)識(shí);與VC6不同,VC2003 VC2005 VC2008及其后續(xù)版本,引入了 manifest清 單的概念,即應(yīng)用程序編譯后會(huì)同時(shí)生成對(duì)應(yīng)的.manifest文件,并將該.manifest文件作為資源編譯到dll或者exe中去。.manifest
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度桶裝水配送服務(wù)外包合同協(xié)議書
- 法院擔(dān)保申請(qǐng)書
- 環(huán)保技術(shù)在商業(yè)建筑中的應(yīng)用與效益
- 中職教案評(píng)比評(píng)價(jià)表
- 現(xiàn)代金融教育中的貨幣市場(chǎng)知識(shí)普及與對(duì)策研究
- 電機(jī)控制器的技術(shù)發(fā)展趨勢(shì)及維護(hù)培訓(xùn)要求
- 未來(lái)職場(chǎng)趨勢(shì)與現(xiàn)代人的挑戰(zhàn)應(yīng)對(duì)
- 2025年度企業(yè)借款風(fēng)險(xiǎn)控制保險(xiǎn)合同范本
- 驗(yàn)資報(bào)告是什么樣的(共4篇)
- 保潔物業(yè)服務(wù)合同范例
- 2024-2030年中國(guó)家禽用馬立克疫苗行業(yè)運(yùn)營(yíng)模式與前景動(dòng)態(tài)預(yù)測(cè)研究報(bào)告
- 2024-2025學(xué)年陜西省英語(yǔ)小升初模擬試卷與參考答案
- 2024信息技術(shù)數(shù)字孿生能力成熟度模型
- 2024年浙江省公務(wù)員考試結(jié)構(gòu)化面試真題試題試卷答案解析
- 2024年四川省廣元市中考化學(xué)試卷(含答案逐題解析)
- DL-T 297-2023 汽輪發(fā)電機(jī)合金軸瓦超聲檢測(cè)
- JGJT 152-2019 混凝土中鋼筋檢測(cè)技術(shù)標(biāo)準(zhǔn)
- 交通銀行股份有限公司操作風(fēng)險(xiǎn)管理政策
- 2024年《公務(wù)員法》相關(guān)法律法規(guī)知識(shí)考試題庫(kù)含完整答案(必刷)
- 手術(shù)室氣體的使用
- 數(shù)字證書使用承諾函
評(píng)論
0/150
提交評(píng)論