記憶體洩漏(memory leak)指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況,在大型的、複雜的應用程式中,記憶體洩漏是常見的問題。當以前分配的一片記憶體不再需要使用或無法訪問時,但是卻並沒有釋放它,這時就出現了記憶體洩漏。儘管優秀的程式設計實踐可以確保最少的洩漏,但是根據經驗,當使用大量的函式對相同的記憶體塊進行處理時,很可能會出現記憶體洩漏。
現在有很多方法來檢測記憶體洩露,以下列舉了常用的記憶體洩露檢測工具。
應用環境:windows + vc
程式語言:c/c++
使用方法:只需包含標頭檔案vld.h,並新增提供的lib
結果輸出:輸出到vc的除錯視窗中
設計思路: 註冊_crtsetallochook鉤子函式,使用vc自帶的crt debug heap
優缺點:可以獲得記憶體洩**的呼叫堆疊,可以得到記憶體洩露的完整資料
如何獲取:
應用環境:windows + vc6.0
程式語言:c/c++
使用方法:安裝使用,會自動在vc內建立右鍵選單
結果輸出:輸出到vc的除錯視窗中
設計思路: 未知
優缺點:可以檢測記憶體洩露;資源洩漏;對指標的錯誤操作,記憶體讀、寫溢位;使用未初始化的記憶體
如何獲取:
,安裝licence時,需要將日期調整為2023年,然後安裝licence。有乙個licence安裝後顯示是8.3的,但是可以使用。
應用環境:linux glibc
程式語言:c
使用方法: 包含標頭檔案mcheck.h,定義環境變數malloc_trace為輸出檔名,程式開始時呼叫mtrace()即可。
結果輸出:使用者指定的檔案
設計思路: 為malloc,realloc,free函式新增鉤子函式,記錄每一對malloc-free的執行
優缺點:只能檢查使用malloc/realloc/free造成的的記憶體洩露
如何獲取:glibc自帶,可直接使用
應用環境: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)等等
如何獲取:
應用環境:linux
程式語言:c/c++
使用方法: 加入memwatch.h,編譯時加上-dmemwatch -dmw_stdio及memwatch.c
結果輸出:輸出檔名稱為memwatch.log,在程式執行期間,錯誤提示都會顯示在stdout上
優缺點:能夠檢測:
如何獲取:
應用環境:linux/windows
程式語言:c++
結果輸出:控制台console
設計思路: 通過過載new和delete操作符來捕獲記憶體申請/釋放請求,並在程式內部維護乙個全域性靜態變數的雜湊鍊錶。在new操作符中,不僅僅分配使用者所要求的記憶體,而是在為每次分配的記憶體都新增乙個頭部,儲存著此次分配的位置資訊和鍊錶指標,new返回的是分配的這塊記憶體加上頭部偏移後的值,而在之前已經將此返回值作了hash計算並新增到hash鍊錶中了。delete的時候先根據要釋放的指標位址做hash計算,然後再遍歷陣列hash值處的鍊錶進行查詢,如果找到則將該節點移除,未找到就abort。這樣在程式結束之後,通過檢查此陣列中是否還有未釋放的記憶體塊來確定是否有記憶體洩露。
優缺點:跨平台,僅用於c++程式,
如何獲取:
以上的這些分析工具,所使用的方法大致分為以下幾種:
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。
幾種記憶體洩露檢測工具的比較
記憶體洩漏 memory leak 指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況,在大型的 複雜的應用程式中,記憶體洩漏是常見的問題。當以前分配的一片記憶體不再需要使用或無法訪問時,但是卻並沒有釋放它,這時就出現了記憶體洩漏。儘管優秀的程式設計實踐可以確保最少的洩漏,但是根據經驗,當使...
記憶體洩露檢測工具 valgrind
valgrind 安裝 2.解壓安裝包 tar jxvf valgrind 3.2.3.tar.bz2 3.解壓後生成目錄valgrind 3.2.3 4.cd valgrind 3.2.3 5.執行.autogen.sh設定環境 需要標準的autoconf工具 可選 6.configure 配置v...
Linux C記憶體洩露檢測工具
在linux下些c語言程式,最大的問題就是沒有乙個好的程式設計ide,當然想kdevelop等工具都相當的強大,但我還是習慣使用kdevelop工具,由於沒有乙個習慣的程式設計ide,記憶體檢測也就成了在linux下編寫程式的乙個大問題。是不是說沒有一種記憶體檢查工具能夠在linux使用呢,也不是,...