1. 程式人生 > >關於使用vld來進行記憶體洩漏檢測的基礎知識

關於使用vld來進行記憶體洩漏檢測的基礎知識

一.      記憶體洩漏的危害

記憶體洩漏產生的根本原因在於動態申請的記憶體未及時釋放或未正確的釋放。

1.       耗光記憶體,程式無法正常工作或崩潰

2.       產生記憶體碎片,在實際記憶體夠用的情況下,因為沒有足夠大的連續記憶體塊,而導致程式申請記憶體失敗

記憶體洩露最明顯最直接的影響就是導致系統中可用的記憶體越來越少。直到所有的可用記憶體用完最後導致系統無可用記憶體而崩潰。      
如果導致洩露的操作是一次性的,或是不經常的,一般問題都不大。在應用退出或系統退出時會清理記憶體;
        如果導致洩露的操作是經常性的或是迴圈的,則記憶體會最終消耗完(或很短時間內)而導致系統崩潰。
        記憶體在由程式申請後按理說應該在不使用的時候合理的釋放掉,洩露就是在被申請的記憶體不在使用的時候一直未被回收,從而導致該塊記憶體永不會再被使用而導致可用記憶體被耗光。

二.      如何排查記憶體洩漏

1)      VS環境內建的記憶體洩漏檢查 (不便於針對特定場景檢測,部分洩漏檢測不出來)

2)      使用virtual leak detector來檢查記憶體洩漏

3)      其他靜態掃描工具

本文主要介紹使用vld來進行記憶體洩漏檢測的相關事項。

VLD支援排查特定執行緒的洩漏、所有執行緒的洩漏、在特定的階段啟用洩漏檢查,安裝非常方便,從網站上下載安裝包,安裝即可(注意勾選整合到開發環境的選項)

 安裝完成後,需要做檢測的地方,只要#include<vld.h>,即可啟用記憶體洩漏檢測了。

VLD支援多樣化的檢測設定介面,具體如下:

1.       單一執行緒的記憶體洩漏排查

1) VLDDisable   禁用當前執行緒的記憶體洩漏檢測

2) VLDEnable    啟用當前執行緒的記憶體洩漏檢測

3) VLDRestore   還原當前執行緒的記憶體洩漏檢測設定到上一個狀態

利用這個方法,可以做到只檢測特定執行緒的記憶體洩漏,也可以排除此特定執行緒的記憶體洩漏檢測。

2.       整個程式的記憶體洩漏排查

1)      VLDGlobalDisable

2)      VLDGlobalEnable

利用這個方法,可以做到只檢測特定階段的記憶體洩漏,比如程式啟動過程中的記憶體洩漏,不進行檢測,只能當程式初始化完成後,再啟動檢測。

3.       針對特定模組來使用記憶體洩漏排查

1)          VLDEnableModule

2)  VLDDisableModule

4.       獲取相關的洩漏資訊

#define VLDReportLeaks() (0)  列印整個程式當前執行此函式前的記憶體洩漏

#define VLDReportThreadLeaks() (0) 列印特定執行緒在執行此函式前的記憶體洩漏

#define VLDGetLeaksCount() (0)      獲取整個程式當前的記憶體洩漏數量

#define VLDGetThreadLeaksCount() (0)  獲取指定執行緒當前的記憶體洩漏數量

#define VLDMarkAllLeaksAsReported()      標記當前的洩漏為已經報告過,後續不再報告

#define VLDMarkThreadLeaksAsReported(a)  標記指定執行緒當前的洩漏為已經報告過,後續不再報告

5.  其他高階功能

#define VLDRefreshModules()           重新整理載入的模組列表,以便針對動態載入的模組進行記憶體洩漏檢查 

#define VLDGetOptions() (0)          獲取檢測的設定 (不太清楚

#define VLDGetReportFilename(a)      獲取洩漏報告生成的資料夾名

#define VLDSetOptions(a, b, c)       設定檢測選項

#define VLDSetReportHook(a, b)      自定義的記憶體洩漏報告回撥函式(不清楚

#define VLDSetModulesList(a)        設定要包含或者排除洩漏檢測的模組列表

#define VLDGetModulesList(a, b) (FALSE)  獲取檢測中的模組列表

#define VLDSetReportOptions(a, b)

#define VLDResolveCallstacks() (0)

更多資訊直接檢視官方文件及程式碼註釋。

三. 如何避免記憶體洩漏

1.      避免堆記憶體申請

2.      使用智慧指標來管理堆記憶體的申請與釋放 

示例程式碼請從此下載:

歡迎大家補充!

相關推薦

關於使用vld進行記憶體洩漏檢測基礎知識

一.      記憶體洩漏的危害 記憶體洩漏產生的根本原因在於動態申請的記憶體未及時釋放或未正確的釋放。 1.       耗光記憶體,程式無法正常工作或崩潰 2.       產生記憶體碎片,在實際記憶體夠用的情況下,因為沒有足夠大的連續記憶體塊,而導致程式申請記憶體失

利用Android Studio、MAT對Android進行記憶體洩漏檢測

專案進入維護階段時才有時間測試分析app的記憶體問題,這時就要用到測試工具了,可以使用Android Studio、MAT互相結合進行測試, 但是對於複雜的,這兩者很難分析出來,但這兩測試工具也是必須掌握的,感覺網上大多文章講得不怎麼細緻,所以想寫篇文章記錄下,剛好看到本文

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

如何使用Valgrind memcheck工具進行C/C++的記憶體洩漏檢測

1. 使用未初始化的記憶體 Code : #include <stdio.h> #include <stdlib.h> int main(void) { char *p; char c = *p; printf("\n [%c]\n",c);

記憶體洩漏檢測vld: 應用程式無法正常啟動(0xc0150002)

做專案的時候發現專案里加了vld這個工具用來檢測記憶體洩漏,就想自己學著用用。 先建了個空的命令列專案,包含標頭檔案vld.h, 把vld.lib和vld_x86.dll拷到工程目錄下(由於我的系統是64位的,所以這掛了,找了好久發現是dll不匹配,so上網找64位的dll

記憶體洩漏檢測分析工具

monkey 工具測試應用 可以使用monkey自動化測試工具快速不斷的操作應用。終端指令: // 300 毫秒一個事件,2000個事件,跑10分鐘 adb shell monkey -p com.android.deskclock -v --throttle 300 --ign

安卓專案實戰之記憶體洩漏檢測神器LeakCanary

為什麼會產生記憶體洩漏? Java記憶體洩漏指的是程序中某些物件(垃圾物件)已經沒有使用價值了,但有另外一個正在使用的物件持有它的引用,從而導致它不能回收停留在堆記憶體中,這就產生了記憶體洩漏。無用的物件佔據著記憶體空間,使得實際可使用記憶體變小,形象地說法就是記憶體洩漏了。 記憶體

c++記憶體洩漏檢測工具(上)

原文連結: http://blog.csdn.net/beanjoy/article/details/7578372   1/  VC自帶的CRT:_CrtCheckMemory   偵錯程式和 CRT 除錯堆函式 用法 /********

記憶體管理四 記憶體洩漏檢測kmemleak

一、簡介:     Kmemleak工作於核心態,Kmemleak 提供了一種可選的核心洩漏檢測,其方法類似於跟蹤記憶體收集器。當獨立的物件沒有被釋放時,其報告記錄在 /sys/kernel/debug/kmemleak中,Kmemcheck能夠幫助定位大

iOS記憶體洩漏檢測方法

常見洩漏的點 Retain Cycle,Block強引用 NSTimer釋放不當 第三方提供方法造成的記憶體洩漏 CoreFoundation方式申請的記憶體,忘記釋放     1. Block引用記憶體洩漏問題: [cell setSelectTagCityBl

linux記憶體除錯、記憶體洩漏檢測以及效能分析的工具-valgrind

Valgrind這個名字取自北歐神話中英靈殿的入口。 Valgrind的最初作者是Julian Seward,他於2006年由於在開發Valgrind上的工作獲得了第二屆Google-O’Reilly開原始碼獎。 Valgrind遵守GNU通用公共許可證條款,是一款自由軟體。 官

[原始碼和文件分享]基於過載演算法的記憶體洩漏檢測記憶體越界檢測

通過過載`new`,`delete`實現對在動態記憶體分配中記憶體越界和記憶體洩露的自動檢測 1. 記憶體洩漏 1.1 簡介 `記憶體洩漏`是當程式不正確地進行記憶體管理時出現的一種資源洩漏,表現為程式不再需要使用的記憶體空間並沒有及時被釋放掉。記憶體洩漏並非指實體記憶體的消失,而是在程

C 記憶體洩漏檢測工具

所有使用動態記憶體分配(dynamic memory allocation)的程式都有機會遇上記憶體洩露(memory leakage)問題,在Linux裡有三種常用工具來檢測記憶體洩露的情況,包括: mtrace dmalloc memwatch 1. mtrace

C++ 記憶體洩漏檢測1:微軟自帶的記憶體洩漏檢測方法

在程式總的包含標頭檔案中新增以下程式碼, #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) #else #define DEBUG_CLIENTBLOCK

記憶體洩漏檢測實戰(一)

利用Android Studio的Android Profiler、MAT對Android進行記憶體洩漏檢測 前言 在之前的兩篇文章中,Android記憶體管理&MemoeryLeak&OOM分析 和 Android記憶體優化技巧,已經覆蓋了A

C++ 記憶體洩漏檢測方法

程式中通常包含著靜態儲存區和棧記憶體。靜態儲存區也就是靜態記憶體,是用來儲存區域性static物件、類static資料成員以及定義在任何函式之外的變數(全域性變數)。棧記憶體用來儲存定義在函式內的非static物件。分配在靜態或棧記憶體中的物件由編譯器自動建立

Unix下C程式記憶體洩漏檢測工具Valgrind安裝與使用

                Valgrind是一款用於記憶體除錯、記憶體洩漏檢測以及效能分析的軟體開發工具。 Valgrind的最初作者是Julian Seward,他於2006年由於在開發Valgrind上的工作獲得了第二屆Google-O'Reilly開原始碼獎。 Valgrind遵守GNU通用公共許

linux記憶體洩漏檢測

在實際的專案中,最難纏的問題就是記憶體洩漏,當然還有panic之類的,記憶體洩漏分為兩部分使用者空間的和核心空間的.我們就分別從這兩個層面分析一下.      使用者空間檢視記憶體洩漏和解決都相對簡單。定位問題的方法和工具也很多相對容易.我們來看看.   &n

C++中基於Crt的記憶體洩漏檢測

儘管這個概念已經讓人說濫了 ,還是想簡單記錄一下, 以備以後查詢。#ifdef _DEBUG#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif

Netty記憶體洩漏檢測機制

廣泛使用直接記憶體是Netty成為高效網路框架的原因之一。然而,直接記憶體釋放並不受GC的控制,Netty中的對於直接記憶體的使用類似與C語言中(malloc、free),需要開發者手動分配和回收記憶體,而JVM GC只負責回收JAVA堆上的引用以及堆中記憶體。