如何查詢記憶體洩露

2021-05-28 09:01:05 字數 1852 閱讀 3606

這兩天,在查詢記憶體洩露的問題。因為記憶體都是放在memory pool裡,所以不能通過valgrind等工具抓到那個地方分配的記憶體沒有手動被釋放。

使用gcc,有乙個方法去打包記憶體分配函式,而且不需要編輯已有的code並且不需要修改目標檔案。linker ld 提供了乙個內建的選項去替換函式符號。

–wrap(乙個橫線) 表示把函式 func

替換為(兩個下劃線字首)__wrap_

func

。可以通過這個選項傳給gcc去做恰當的鏈結。

舉個例子來說明吧。  如果最後的free函式被注釋掉,那麼p就會出現記憶體洩漏,如果calloc已經被打包把記憶體放到memory pool裡,程式退出啟用釋放memory pool的話。

那麼在程式為退出之前,那些mem還是存在的,因此當前程序會暫用很多記憶體(如果很多分配沒有free的話)

view plain

copy to clipboard

print?

#include

using

namespace std;  

int main()  

}  怎樣來檢查這些分配沒釋放的記憶體呢。就可以使用上面說的,定義一些函式,然後通過編譯器傳給聯結器去替換函式。

把這些函式定義在乙個檔案中(test.h):

view plain

copy to clipboard

print?

#ifndef  test_inc

#define  test_inc

#include

using

namespace std;  

#ifdef __cplusplus

extern

"c"   

/* wrap realloc */

void *  

__wrap_realloc(void *ptr, size_t size)  

/* wrap malloc */

void *  

__wrap_malloc(size_t size)  

/* wrap malloc */

void __wrap_free(void *p)  

#ifdef __cplusplus

}; /* end of extern "c" */

#endif

#endif   /* ----- #ifndef test_inc  ----- */

.cpp只需要加上這個標頭檔案

view plain

copy to clipboard

print?

#include

using

namespace std;  

"color:#ff0000;">#include "test.h"

int main()  

}  然後在makefile加上編譯選項

cflags = -g -o0 -wall -wl,--wrap,malloc -wl,--wrap,free -wl,--wrap,calloc -wl,--wrap,realloc
或者g++  test.cc -o test  -g  -o0 -wall -wl,--wrap,calloc -wl,--wrap,free -wl,-wrap,malloc -wl,-wrap,realloc 去編譯乙個檔案

執行 ./test 即可發現alloc 和 free不匹配。

此方法只是拋磚引玉。可以對包裝函式裡加更多的東西,比如以分配記憶體位址建立map,first = (long)分配位址,second初始化為0。free掉了就賦值1.最後遍歷map來查詢未free的。當然更好的還是要記錄下分配函式的呼叫檔案以及位置,這是很簡單的實現了。.......

umdh查詢記憶體洩露

配置環境變數 windbg目錄 cd c program files x86 windows kits 8.0 debuggers x86 啟用池標記 gflags.exe i partsmodelselection.exe ust 開啟應用程式 建立快照1 umdh.exe p 9432 f u1...

如何檢查記憶體洩露

前一段時間寫了一些 自以為速度和效率都還不錯,測試執行了一段時間,發現 程式總會在中途死掉,仔細查查,原來是記憶體洩露的原故。看來寫程式還真是個細活,以後在這方面要加強。下面是我從網上搜到的檢查記憶體洩露的文章,還比較有用,牛人真是無處不在啊,以後有問題要多動手從網上找原因。如何檢查記憶體洩露問題 ...

如何管理記憶體洩露

內容很簡單,感覺用的話可以下。釋放超出範圍 忘記釋放 void testfuc 或者 testclass void foo 3.錯誤的使用new delete double d new double 12 delete d delete d 0 必須使用delete d 4.錯誤釋放 int i w...