一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

VLD(Visual LeakDetector)內(nèi)存泄露庫的使用

 witoojhb 2018-12-24

VLD簡介

    由于C/C++語言沒有所謂的垃圾收集器,內(nèi)存的分配和釋放都需要程序員自己來控制,這會(huì)給C/C++程序員帶來一定的困難。當(dāng)您的程序越來越復(fù)雜時(shí),它的內(nèi)存管理也會(huì)變得越來越困難。內(nèi)存泄漏、內(nèi)存越界是最常見的內(nèi)存問題之一。
    內(nèi)存泄漏如果不是很嚴(yán)重的話,在短時(shí)間內(nèi)對(duì)程序不會(huì)造成太大的影響,而且在進(jìn)程終止的時(shí)候,所有分配的內(nèi)存都會(huì)釋放掉。但是對(duì)于長時(shí)間運(yùn)行的程序,其破壞力是驚人的,從性能下降到內(nèi)存耗盡,甚至?xí)绊懙狡渌绦虻恼_\(yùn)行。
    此外,內(nèi)存問題存在一個(gè)共同的特點(diǎn),它本身并不會(huì)有很明顯的現(xiàn)象,當(dāng)有異常出現(xiàn)時(shí)就很難檢查問題的原因所在,這給調(diào)試內(nè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)庫的形式提供,無需編譯源代碼,只需要很小的改動(dòng)程序;
    5)  源代碼使用GNU許可發(fā)布,并有詳細(xì)的文檔及其注釋。
    從使用的角度講,VLD簡單易用,對(duì)于使用者自己的代碼中唯一需要修改的地方是#include VLD的頭文件后正常運(yùn)行自己的程序就可以發(fā)現(xiàn)內(nèi)存問題。從研究角度上講,如果輸入到VLD源代碼,可以學(xué)習(xí)到堆內(nèi)存分片與釋放的原理、內(nèi)存檢查的原理機(jī)器內(nèi)存操作的常用技巧等。

VLD使用

    VLD網(wǎng)址:http://vld./
    http://www./Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio
    下載Visual LeakDetector,當(dāng)前版本2.2.3,打開Visual C++ IDE的"工具"→"選項(xiàng)"→"項(xiàng)目和解決方案"→"VC++ 目錄",在"包含文件"中增加VLD的頭文件路徑"\include"路徑,在"庫文件"增加VLD庫文件的"\lib\Win32"路徑,此外動(dòng)態(tài)庫的"\bin\Win32"路徑在安裝時(shí)已經(jīng)添加到環(huán)境變量里面了,若是未添加,則需要手動(dòng)拷貝"\bin\Win32"下的文件到可執(zhí)行文件所在的目錄中(拷貝的文件有dbghelp.dll/Microsoft.DTfW.DHL.manifest/vld_x86.dll/vld.ini)。
接下來需要將VLD加入到自己的代碼中。方法很簡單,只要在包含入口函數(shù)的.cpp文件中包含vld.h就可以。如果這個(gè)cpp文件中包含了stdafx.h,則將包含vld.h的語句放在stdafx.h的包含語句之后,否則放在最前面。
    示例程序:
#include<vld.h>                 // 包含VLD的頭文件
#include<stdlib.h>
#include<stdio.h>
void f()
{
    int *p = new int(0x12345678);
    printf("p=%08x, ", p);
}
int main()
{
    f();
    return 0;
}
    注:VLD只能在Windows下使用,在包含vld.h頭文件時(shí)增加預(yù)編譯選項(xiàng)。
    注:在Release模式下,不會(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.txt 
ReportTo = both

VLD工具原理

    下面我們來看看VLD是如何工作的。在VisualC++中內(nèi)置工具CRT Debug Heap工具,在使用Debug版本分配內(nèi)存時(shí),它會(huì)在內(nèi)存塊中記錄分配該內(nèi)存的文件名和行號(hào)。當(dāng)程序退出時(shí)CRT會(huì)在main函數(shù)返回時(shí)做一些清理工作,此時(shí)檢查調(diào)試堆內(nèi)存,如果仍然有內(nèi)存沒釋放,則一定存在內(nèi)存泄漏問題。從這些沒有被釋放的內(nèi)存塊的頭中可以得到文件名和行號(hào)。這種靜態(tài)的方法可以檢查出內(nèi)存泄漏,但是不知道泄漏究竟是怎么發(fā)生的,也不知道該內(nèi)存分配語句是如何被執(zhí)行到的,想要了解這些必須對(duì)內(nèi)存分配過程進(jìn)行動(dòng)態(tài)跟蹤。VLD就是這樣做的,在每次內(nèi)存分配的時(shí)候記錄其上下文,當(dāng)程序退出時(shí)對(duì)檢測到的內(nèi)存泄漏查找其上下文信息,并轉(zhuǎn)換成報(bào)告輸出到Output中。

初始化

    VLD要記錄每次的內(nèi)存分配,它通過Windows提供的分配鉤子allocation hooks來監(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)存分配則可能無法檢測到。因此,VLD使用C/C++提供的#pragma init_seg來減少其它全局變量在它之前進(jìn)行初始化。根據(jù)#pragma init_seg的定義,全局變量初始化分為3個(gè)階段,首先是compiler階段,一般進(jìn)行C語言運(yùn)行時(shí)庫的初始化;然后是lib段,一般用于第三方類庫的初始化扽;最后是user段,大部分的初始化都在這個(gè)階段進(jìn)行。

記錄內(nèi)存分配

    一個(gè)內(nèi)存分配鉤子函數(shù)需要具有如下的定義:
int AllocHook(int allocType, void*userData, size_t size,int blockType, long requestNumber, onst unsigned char*filename, int lineNumber);
    該函數(shù)需要在VLD初始化時(shí)被注冊(cè),每次從堆中分配內(nèi)存前被調(diào)用,它需要處理的事情就是記錄下此時(shí)的調(diào)用堆棧和此時(shí)堆內(nèi)存分配的唯一標(biāo)識(shí)requestNumber。
得到當(dāng)前堆棧的二進(jìn)制表示并不是很復(fù)雜的事情,但是因?yàn)椴煌捏w系結(jié)構(gòu)、不同的編譯器、不同的操作系統(tǒng)所產(chǎn)生的堆棧內(nèi)容是不一樣的,要解釋堆棧并得到整個(gè)函數(shù)的調(diào)用過程比較復(fù)雜。不過Windows提供了一個(gè)StackWalk64函數(shù)可以獲得堆棧的內(nèi)容。
    VLD是常用的C/C++內(nèi)存泄漏檢查工具,可以在ViusalC++中使用,在Viusal Studio 2008和2010中使用需要注意兩點(diǎn):
    1)  版本問題:VLD已經(jīng)更新到2.2版本,修正了許多bug,而且在2010版本下工作良好,VisualC++ 6.0推薦使用1.0版本,1.9b版本不是很穩(wěn)定不建議使用,2.2版本的下載網(wǎng)址為http://vld..
    2)  設(shè)置變化:VC++Directories設(shè)置已經(jīng)變化位置,在2010中設(shè)置過程如下:
View | Other Window | Property Manager
Go to "VC++ Directories" settings
Set include folder path
Set lib folder path
    點(diǎn)OK,我們就設(shè)置好了include和lib目錄。

使用問題

問題1:VLD 1.9

    在vista下使用vld的使用,總是出現(xiàn)錯(cuò)誤無法正常工作,后來經(jīng)過搜索,在http://www./KB/applications/visualleakdetector.aspx
上的評(píng)論中找到了解決的方法:
    評(píng)論“Solution forrunning 1.9 beta on Visual Studio 2008 with Vista ”給出了解決方法:
評(píng)論1:
VLD keptcrashing when trying to use 1.9g beta on Windows Vista, visual studio 2008. Itried all the suggestions on here and nothing worked. But I finally figured itout.
when you make a project in visual C++ 2008,it sets some strange advanced Linker properties that cause VLD to crash:
I changedLinker->Advanced->Randomized Base Address from Enable Image Randomization(/DYNAMICBASE) to Disable Image Randomization (/DYNAMICBASE:NO)
Then I changed Linker->Advanced->DataExecution Prevention from Image is compatible with DEP (/NXCOMPAT) to Default
And now it works perfectly
Please let me know if this helped you!It'll make me feel better for spending a whole day trying to get it working!
 -Nadav
評(píng)論2:
The base address randomization seems to benot necessary. Just disable DEP.
   大致的意思是說,只需要禁用DEP即可,
   在工程的“屬性”->“鏈接器”->“高級(jí)”->數(shù)據(jù)執(zhí)行保護(hù)(DEP),設(shè)為“默認(rèn)”(default)或者“映像與 DEP 不兼容(/NXCOMPAT:NO)“ 即可。(修改后好像不可用)。
  注:這個(gè)選項(xiàng)只針對(duì)Vista有效?。。?/pre>

問題2:VLD 2.2.3

    在項(xiàng)目中使用了visual leak detector,調(diào)試時(shí)程序無法啟動(dòng)報(bào)錯(cuò)“應(yīng)用程序正常啟動(dòng)失敗(0xc0150002)”。
    解決流程:
    查看vs輸出信息最后一條是:
Theprogram '[3980] MobileSignalAnalyzer.exe: Native' has exited with code-1072365566 (0xc0150002)
    在網(wǎng)上多方查找有:
http://blog.csdn.net/evilswords/article/details/5698851
http://blog.csdn.net/brook0344/article/details/6685724
    這兩篇有解決辦法,就是把VLD中的這兩個(gè)復(fù)制到執(zhí)行文件夾下就正常了
Microsoft.VC90.CRT.manifest
Microsoft.DTfW.DHL.manifest
    產(chǎn)生原因:
    VC2003、VC2005、VC2008及其后續(xù)版本,對(duì)底層最基本的CRT、MFC、ATL庫都進(jìn)行了重構(gòu),為了避免不同版本的庫引起沖突,重構(gòu)后的庫文件一般放在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文件實(shí)際上是一個(gè)XML格式的文本文件,里面記錄了dll或exe中要引用的CRT、MFC、ATL庫的版本和名稱。VC6編譯的應(yīng)用程序?qū)RT、MFC、ATL的dll都是直接調(diào)用,而VC2003、VC2005、VC2008編譯的程序都是先查詢編譯到資源中的manifest中的記錄,然后按照記錄提供的版本和名稱去搜尋對(duì)應(yīng)的CRT、MFC、ATL庫以及隨庫發(fā)布的.manifest文件,搜尋的路徑包括當(dāng)前目錄、C://windows/WinSxS等等,如果沒有找到對(duì)應(yīng)的庫文件,則提示“應(yīng)用程序正常初始化失敗”。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    欧美日韩免费黄片观看| 在线观看视频日韩成人| 日韩精品视频免费观看| 国产精品久久女同磨豆腐| 男人和女人黄 色大片| 亚洲欧美天堂精品在线| 婷婷色国产精品视频一区| 日韩欧美好看的剧情片免费| 欧美不卡高清一区二区三区| 99久只有精品免费视频播放| 日韩三极片在线免费播放| 日本不卡在线一区二区三区| 日韩欧美中文字幕人妻| 91超精品碰国产在线观看| 日韩视频在线观看成人| 我要看日本黄色小视频| 国产又色又爽又黄又免费| 欧美激情一区二区亚洲专区| 色婷婷在线精品国自产拍| 天海翼精品久久中文字幕| 欧美自拍系列精品在线| 91精品视频全国免费| 国产精品午夜小视频观看| 欧美有码黄片免费在线视频| 日韩aa一区二区三区| 少妇人妻精品一区二区三区| 国产成人一区二区三区久久| 精品日韩欧美一区久久| 狠狠做五月深爱婷婷综合| 草草视频福利在线观看| 亚洲视频一区二区久久久| 国产自拍欧美日韩在线观看| 激情内射亚洲一区二区三区| 日韩欧美国产精品中文字幕| 日本 一区二区 在线| 午夜福利网午夜福利网| 亚洲第一区二区三区女厕偷拍| 开心五月激情综合婷婷色| 久久福利视频这里有精品| 日本理论片午夜在线观看| 99国产高清不卡视频|