日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

几种内存泄露检测工具的比较

發布時間:2023/12/31 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 几种内存泄露检测工具的比较 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述
內存泄漏(memory leak)指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況,在大型的、復雜的應用程序中,內存泄漏是常見的問題。當以前分配的一片內存不再需要使用或無法訪問時,但是卻并沒有釋放它,這時就出現了內存泄漏。盡管優秀的編程實踐可以確保最少的泄漏,但是根據經驗,當使用大量的函數對相同的內存塊進行處理時,很可能會出現內存泄漏。

內存泄露可以分為以下幾類:
1. 常發性內存泄漏。發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。
2. 偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對于特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。
3. 一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者由于算法上的缺陷,導致總會有一塊且僅一塊內存發生泄漏。比如,在一個Singleton類的構造函數中分配內存,在析構函數中卻沒有釋放該內存。而Singleton類只存在一個實例,所以內存泄漏只會發生一次。
4. 隱式內存泄漏。程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這里并沒有發生內存泄漏,因為最終程序釋放了所有申請的內存。但是對于一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏為隱式內存泄漏。 (百度百科)

檢測工具
現在有很多方法來檢測內存泄露,以下列舉了常用的內存泄露檢測工具。

Visual Leak Detecter
應用環境:Windows + VC

編程語言:C/C++

使用方法:只需包含頭文件vld.h,并添加提供的lib

結果輸出:輸出到VC的調試窗口中

設計思路: 注冊_CrtSetAllocHook鉤子函數,使用VC自帶的CRT Debug Heap

優缺點:可以獲得內存泄露點的調用堆棧,可以得到內存泄露的完整數據

如何獲取:http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio

Bounds Checker
應用環境:Windows + VC6.0

編程語言:C/C++

使用方法:安裝使用,會自動在VC內創建右鍵菜單

結果輸出:輸出到VC的調試窗口中

設計思路: 未知

優缺點:可以檢測內存泄露;資源泄漏;對指針的錯誤操作,內存讀、寫溢出;使用未初始化的內存

如何獲取:http://3ddown.com/soft/31594.htm,安裝licence時,需要將日期調整為2008年,然后安裝licence。有一個licence安裝后顯示是8.3的,但是可以使用。

mtrace
應用環境:Linux GLIBC

編程語言:C

使用方法: 包含頭文件mcheck.h,定義環境變量MALLOC_TRACE為輸出文件名,程序開始時調用mtrace()即可。

結果輸出:用戶指定的文件

設計思路: 為malloc,realloc,free函數添加鉤子函數,記錄每一對malloc-free的執行

優缺點:只能檢查使用malloc/realloc/free造成的的內存泄露

如何獲取:GLIBC自帶,可直接使用

memwatch
應用環境:Linux

編程語言:C

使用方法: 加入memwatch.h,編譯時加上-DMEMWATCH -DMW_STDIO及memwatch.c

結果輸出:輸出文件名稱為memwatch.log,在程序執行期間,錯誤提示都會顯示在stdout上

設計思路:將malloc/realloc/calloc/strdup/free等重定義為mwMalloc(sz, FILE, LINE)等,內部維護一個操作鏈表

優缺點:能檢測雙重釋放(double-free)、錯誤釋放(erroneous free)、內存泄漏(unfreed memory)、溢出(Overflow)、下溢(Underflow)等等

如何獲取:http://memwatch.sourceforge.net/

valgrind
應用環境:Linux

編程語言:C/C++

使用方法: 加入memwatch.h,編譯時加上-DMEMWATCH -DMW_STDIO及memwatch.c

結果輸出:輸出文件名稱為memwatch.log,在程序執行期間,錯誤提示都會顯示在stdout上

設計思路:根據軟件的內存操作維護一個有效地址空間表和無效地址空間表(進程的地址空間)

優缺點:能夠檢測:

使用未初始化的內存 (Use of uninitialised memory)
使用已經釋放了的內存 (Reading/writing memory after it has been free’d)
使用超過 malloc分配的內存空間(Reading/writing off the end of malloc’d blocks)
對堆棧的非法訪問 (Reading/writing inappropriate areas on the stack)
申請的空間是否有釋放 (Memory leaks – where pointers to malloc’d blocks are lost forever)
如何獲取:http://valgrind.org/

debug_new
應用環境:Linux/Windows

編程語言:C++

使用方法: 包含頭文件debug_new.h,鏈接debug_new.cpp

結果輸出:控制臺console

設計思路: 通過重載new和delete操作符來捕獲內存申請/釋放請求,并在程序內部維護一個全局靜態變量的哈希鏈表。在new操作符中,不僅僅分配用戶所要求的內存,而是在為每次分配的內存都添加一個頭部,存儲著此次分配的位置信息和鏈表指針,new返回的是分配的這塊內存加上頭部偏移后的值,而在之前已經將此返回值作了HASH計算并添加到HASH鏈表中了。delete的時候先根據要釋放的指針地址做HASH計算,然后再遍歷數組HASH值處的鏈表進行查找,如果找到則將該節點移除,未找到就abort。這樣在程序結束之后,通過檢查此數組中是否還有未釋放的內存塊來確定是否有內存泄露。

優缺點:跨平臺,僅用于C++程序,

如何獲取:http://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html

總結
以上的這些分析工具,所使用的方法大致分為以下幾種:

1、注冊內存分配/釋放鉤子函數(hook)。在Linux下可以malloc_hook, free_hook等5個鉤子函數,在Windows下可以注冊_CrtSetAllocHook鉤子函數,這樣在分配內存的時候就可以捕獲這一請求并加以處理。Visual Leak Detecter和mtrace使用此方式。

2、使用宏定義替換。將用戶代碼中的malloc, free 替換為宏定義的 mwMalloc(sz, FILE, LINE)等自定義函數,從而跟蹤內存請求,memwatch即使用此方式。

3、操作符重載。此方法僅用于C++語言中,通過重載new、delete操作符來實現跟蹤內存請求,重載后的操作符類似于鉤子函數意義。debug_new采用此方式。

這些工具的輸出方式也分以下幾種:

1、Windows VC環境下一般輸出到調試窗口中,因此VC本身就提供了一個理想的輸出場所,并且GUI應用程序輸出到標準輸出時不可見的。Visual Leak Detecter采用此法。

2、輸出到標準輸出或標準錯誤輸出:控制臺應用程序可以輸出到屏幕,如memwatch, valgrind, debug_new都是采用這種方法。

3、輸出到日志文件:將結果輸出到用戶指定或默認的日志文件中,如mtrace和memwatch。

此外,這些工具的內存檢測方式無非也分為兩種:

1、維護一個內存操作鏈表,當有內存申請操作時,將其加入此鏈表中,當有釋放操作時,從申請操作從鏈表中移除。如果到程序結束后此鏈表中還有內容,說明有內存泄露了;如果要釋放的內存操作沒有在鏈表中找到對應操作,則說明是釋放了多次。使用此方法的有VC內置的調試工具,Visual Leak Detecter,mtrace, memwatch, debug_new。

2、模擬進程的地址空間。仿照操作系統對進程內存操作的處理,在用戶態下維護一個地址空間映射,此方法要求對進程地址空間的處理有較深的理解。因為Windows的進程地址空間分布不是開源的,所以模擬起來很困難,因此只支持Linux。采用此方法的是valgrind。

總結

以上是生活随笔為你收集整理的几种内存泄露检测工具的比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。