VLD(Visual LeakDetector)記憶體洩漏庫的使用
VLD簡介
由於C/C++語言沒有所謂的垃圾收集器,記憶體的分配和釋放都需要程式設計師自己來控制,這會給C/C++程式設計師帶來一定的困難。當您的程式越來越複雜時,它的記憶體管理也會變得越來越困難。記憶體洩漏、記憶體越界是最常見的記憶體問題之一。 記憶體洩漏如果不是很嚴重的話,在短時間內對程式不會造成太大的影響,而且在程序終止的時候,所有分配的記憶體都會釋放掉。但是對於長時間執行的程式,其破壞力是驚人的,從效能下降到記憶體耗盡,甚至會影響到其它程式的正常執行。 此外,記憶體問題存在一個共同的特點,它本身並不會有很明顯的現象,當有異常出現時就很難檢查問題的原因所在,這給除錯記憶體問題帶來了很大的難度。 VLD是一款用於VisualC++的免費記憶體洩漏檢查工具。可以在codeproject.com網站上找到,相比其它的記憶體洩漏哦給你根據,他在檢查記憶體洩漏的同事,還具有如下特點: 1) 可以得到記憶體洩漏點的呼叫堆疊,如果可以的話,還可以得到其所在的檔案及行號; 2) 可以得到洩漏記憶體的完整資料; 3) 惡意設定記憶體洩漏報告的級別; 4) 它以動態庫的形式提供,無需編譯原始碼,只需要很小的改動程式; 5) 原始碼使用GNU許可釋出,並有詳細的文件及其註釋。 從使用的角度講,VLD簡單易用,對於使用者自己的程式碼中唯一需要修改的地方是#include VLD的標頭檔案後正常執行自己的程式就可以發現記憶體問題。從研究角度上講,如果輸入到VLD原始碼,可以學習到堆記憶體分片與釋放的原理、記憶體檢查的原理機器記憶體操作的常用技巧等。VLD使用
VLD工具原理
初始化
記錄記憶體分配
一個記憶體分配鉤子函式需要具有如下的定義: int AllocHook(int allocType, void*userData, size_t size,int blockType, long requestNumber, onst unsigned char*filename, int lineNumber); 該函式需要在VLD初始化時被註冊,每次從堆中分配記憶體前被呼叫,它需要處理的事情就是記錄下此時的呼叫堆疊和此時堆記憶體分配的唯一標識requestNumber。 得到當前堆疊的二進位制表示並不是很複雜的事情,但是因為不同的體系結構、不同的編譯器、不同的作業系統所產生的堆疊內容是不一樣的,要解釋堆疊並得到整個函式的呼叫過程比較複雜。不過Windows提供了一個StackWalk64函式可以獲得堆疊的內容。 VLD是常用的C/C++記憶體洩漏檢查工具,可以在ViusalC++中使用,在Viusal Studio 2008和2010中使用需要注意兩點: 1) 版本問題:VLD已經更新到2.2版本,修正了許多bug,而且在2010版本下工作良好,VisualC++ 6.0推薦使用1.0版本,1.9b版本不是很穩定不建議使用,2.2版本的下載網址為http://vld.codeplex.com. 2) 設定變化:VC++Directories設定已經變化位置,在2010中設定過程如下: View | Other Window | Property Manager Go to "VC++ Directories" settings Set include folder path Set lib folder path 點OK,我們就設定好了include和lib目錄。使用問題
問題1:VLD 1.9
在vista下使用vld的使用,總是出現錯誤無法正常工作,後來經過搜尋,在http://www.codeproject.com/KB/applications/visualleakdetector.aspx 上的評論中找到了解決的方法: 評論“Solution forrunning 1.9 beta on Visual Studio 2008 with Vista ”給出瞭解決方法: 評論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 評論2: The base address randomization seems to benot necessary. Just disable DEP. 大致的意思是說,只需要禁用DEP即可, 在工程的“屬性”->“連結器”->“高階”->資料執行保護(DEP),設為“預設”(default)或者“映像與 DEP 不相容(/NXCOMPAT:NO)“ 即可。(修改後好像不可用)。 注:這個選項只針對Vista有效!!!問題2:VLD 2.2.3
在專案中使用了visual leak detector,除錯時程式無法啟動報錯“應用程式正常啟動失敗(0xc0150002)”。 解決流程: 檢視vs輸出資訊最後一條是: Theprogram '[3980] MobileSignalAnalyzer.exe: Native' has exited with code-1072365566 (0xc0150002) 在網上多方查詢有: http://blog.csdn.net/evilswords/article/details/5698851 http://blog.csdn.net/brook0344/article/details/6685724 這兩篇有解決辦法,就是把VLD中的這兩個複製到執行資料夾下就正常了 Microsoft.VC90.CRT.manifest Microsoft.DTfW.DHL.manifest 產生原因: VC2003、VC2005、VC2008及其後續版本,對底層最基本的CRT、MFC、ATL庫都進行了重構,為了避免不同版本的庫引起衝突,重構後的庫檔案一般放在C://windows/WinSxS 資料夾中,並用特定的資料夾/檔名稱進行標識; 與VC6不同, VC2003、VC2005、VC2008及其後續版本,引入了manifest清單的概念,即應用程式編譯後會同時生成對應的.manifest檔案,並將該.manifest檔案作為資源編譯到dll或者exe中去。.manifest檔案實際上是一個XML格式的文字檔案,裡面記錄了dll或exe中要引用的CRT、MFC、ATL庫的版本和名稱。VC6編譯的應用程式對CRT、MFC、ATL的dll都是直接呼叫,而VC2003、VC2005、VC2008編譯的程式都是先查詢編譯到資源中的manifest中的記錄,然後按照記錄提供的版本和名稱去搜尋對應的CRT、MFC、ATL庫以及隨庫釋出的.manifest檔案,搜尋的路徑包括當前目錄、C://windows/WinSxS等等,如果沒有找到對應的庫檔案,則提示“應用程式正常初始化失敗”。轉自:http://blog.csdn.net/fan_hai_ping/article/details/8023433
相關推薦
VLD(Visual LeakDetector)記憶體洩漏庫的使用
VLD簡介 由於C/C++語言沒有所謂的垃圾收集器,記憶體的分配和釋放都需要程式設計師自己來控制,這會給C/C++程式設計師帶來一定的困難。當您的程式越來越複雜時,它的記憶體管理也會變得越來越困難。記憶體洩漏、記憶體越界是最常見的記憶體問題之一。 記憶體洩漏如
VLD(Visual LeakDetector)記憶體洩露庫的使用
VLD簡介 由於C/C++語言沒有所謂的垃圾收集器,記憶體的分配和釋放都需要程式設計師自己來控制,這會給C/C++程式設計師帶來一定的困難。當您的程式越來越複雜時,它的記憶體管理也會變得越來越困難。記憶體洩漏、記憶體越界是最常見的記憶體問題之一。 記憶體洩漏
iOS總結-檢測記憶體洩漏庫-MLeaksFinder原始碼解析
MLeaksFinder是WeRead團隊開源的一款檢測iOS記憶體洩漏的AOP框架。 優點:無侵入性 可以構建洩漏堆疊 有白名單機制 擴充套件性 其他一些特殊處理 主要涉及到的是基類NSObject+MemoryLeak.h類別裡面,- (BOOL)wi
關於使用vld來進行記憶體洩漏檢測的基礎知識
一. 記憶體洩漏的危害 記憶體洩漏產生的根本原因在於動態申請的記憶體未及時釋放或未正確的釋放。 1. 耗光記憶體,程式無法正常工作或崩潰 2. 產生記憶體碎片,在實際記憶體夠用的情況下,因為沒有足夠大的連續記憶體塊,而導致程式申請記憶體失
Visual Studio中檢測記憶體洩漏的方法
Visual Studio中檢測記憶體洩漏的方法 #include <iostream> //可以定位到發生記憶體洩露 所在的檔案和具體那一行,用於檢測 malloc 分配的記憶體 #define _CRTDBG_MAP_ALLOC #include <s
Visual Studio如何檢查記憶體洩漏
https://msdn.microsoft.com/zh-cn/library/x98tx3cf.aspx Clion中有專門檢查記憶體洩漏的選項,而VS中卻沒有。但是我們可以通過下面的方法檢查: 在程式的開頭加上下面三行: #define CRTDBG_MA
Visual C++ 記憶體洩露檢測工具(VLD)
簡述 C/C++ 程式越複雜,記憶體的管理顯得越重要,稍有不慎就會出現洩漏。如果記憶體洩漏不是很嚴重,在短時間內對程式不會有太大影響,這也使得記憶體洩漏問題有很強的隱蔽性,不易被發現。然而不管記憶體洩漏多麼輕微,當程式長時間執行時,其破壞力是驚人的 - 從效能
Windows 7 下 vs2010記憶體洩漏檢測工具VLD的使用
1 環境和軟體 Windows7 32位系統 Visual Studio 2012 旗艦版 vld-2.2.3-setup.exe 大小1.04M 2 步驟 1)下載安裝 下載好 vld-2.2.3-setup.exe(大小1.04
使用Visual Leak Detector for Visual C++ 捕捉記憶體洩露---Visual C++記憶體洩露檢測—VLD工具使用說明
以下經過測試: 使用Visual Leak Detector for Visual C++ 捕捉記憶體洩露 1、下載vlc 2、建立應用並配置 c/c++ -> General -> Additional Include Directories = C:\P
Android Weak Handler:可以避免記憶體洩漏的Handler庫
這是一個針對技術開發者的一個應用,你可以在掘金上獲取最新最優質的技術乾貨,不僅僅是Android知識、前端、後端以至於產品和設計都有涉獵,想成為全棧工程師的朋友不要錯過! android使用java作為其開發環境。java的跨平臺和垃圾回收機制已經幫助我們解決了底層的一些問題。但是儘管有了垃圾回收機
vld記憶體洩漏檢查工具不能顯示記憶體洩漏檔名與行號
最近用vld工具在VS2015下除錯記憶體洩漏,發現輸出視窗有提示記憶體洩漏,但是並沒有顯示檔名和行號, 網上的解決方法提示檢查dbghelp.dll是否載入正確,以及中文路徑等,對我都不適用。幾經周折發現是 vs裡連結選項的設定問題,debug下聯結器-&g
QT5.51 32位VLD找記憶體洩漏
下載傻瓜式安裝。目錄自己選一個。我是D:/VLD 然後在pro檔案裡面加上一些程式碼 win{ CONFIG(debug,debug|release) { INCLUDEPATH+=D:/VLD/include DEPENDPATH+=Dl/VLD/include L
vs2008 使用Visual Leak Detector檢測記憶體洩漏
http://hi.baidu.com/maydaygmail/item/8ea6ebef87ca9103560f1dfe 靈活自由是C/C++語言的一大特色,而這也為C/C++程 序員出了一個難題。當程式越來越複雜時,記憶體的管理也會變得越加複雜,稍有不慎就會
Visual C++記憶體洩露檢測—VLD工具使用說明d
轉自:http://www.cnblogs.com/lidabo/archive/2012/07/19/2599745.html http://blog.csdn.net/zlQQhs/article/details/10039179 1.VLD工具概述 Visual
VLD記憶體洩漏的配置和使用
在VLD官網上下載VLD,連結點選開啟連結。 預設安裝路徑為:C:\ProgramFiles (x86)\Visual Leak Detector。 安裝後,開啟安裝路徑下的vld.ini檔案,將ReporTo設定為both,這樣在debug和releas
VLD記憶體洩露庫的使用
VLD簡介 由於C/C++語言沒有所謂的垃圾收集器,記憶體的分配和釋放都需要程式設計師自己來控制,這會給C/C++程式設計師帶來一定的困難。當您的程式越來越複雜時,它的記憶體管理也會變得越來越困難。記憶體洩漏、記憶體越界是最常見的記憶體問題之一。
實操VS2015配置記憶體洩漏檢查工具Visual Leak Detector
Visual Leak Detector Version 2.5.1 installed. Outputting the report to the debugger and to C:\Users\bm00076\Documents\Visual Studio 2015\Projects\Conso
記憶體洩漏檢測vld: 應用程式無法正常啟動(0xc0150002)
做專案的時候發現專案里加了vld這個工具用來檢測記憶體洩漏,就想自己學著用用。 先建了個空的命令列專案,包含標頭檔案vld.h, 把vld.lib和vld_x86.dll拷到工程目錄下(由於我的系統是64位的,所以這掛了,找了好久發現是dll不匹配,so上網找64位的dll
Visual Studio2017 數據庫數據比較
ger div b-s -1 height sdn bug png 進行 一、前言 上一篇文章我們介紹了如何使用VS2017對SSMS數據庫進行架構比較。這一篇文章我們將繼續介紹如何對SSMS數據庫的數據進行比較。數據的比較也是很常見的,比如我們要比較當前版本的數據庫相對
基於windows系統中visual studio2017的dlib庫詳細配置安裝流程
平臺 學習 mpi 好的 運行 安裝 說明文 完成 page dlib庫是一個非常強大的開源庫,有詳細的說明文檔和c++代碼,也提供了一些和python的接口,但是安裝和配置的過程略有些麻煩,網上有一些相關教程,但是大都零零星星不全面。筆者親自把所有的坑都踩了一遍,整理出了