如何查找內(nèi)存泄露
這兩天,在查找內(nèi)存泄露的問題。因為內(nèi)存都是放在memory pool里,所以不能通過valgrind等工具抓到那個地方分配的內(nèi)存沒有手動被釋放。使用gcc,有一個方法去打包內(nèi)存分配函數(shù),而且不需要編輯已有的code并且不需要修改目標(biāo)文件。linker ld 提供了一個內(nèi)建的選項去替換函數(shù)符號。 –wrap一個橫線 表示把函數(shù) func 替換為兩個下劃線前綴__wrap_func ??梢酝ㄟ^這個選項傳給gcc去做恰當(dāng)?shù)逆溄?。舉個例子來說明吧。 如果最后的free函數(shù)被注釋掉,那么p就會出現(xiàn)內(nèi)存泄漏,如果calloc已經(jīng)被打包把內(nèi)存放到memory pool里,程序退出激活釋放memory pool的話。那么在程序為退出之前,那些mem還是存在的,因此當(dāng)前進(jìn)程會暫用很多內(nèi)存如果很多分配沒有free的話 view plaincopy to clipboard#include using namespace std; int main { int allocTimes = 100; whileallocTimes-- { int *p = int*calloc5, sizeofint; //freep; } } 怎樣來檢查這些分配沒釋放的內(nèi)存呢。就可以使用上面說的,定義一些函數(shù),然后通過編譯器傳給連接器去替換函數(shù)。把這些函數(shù)定義在一個文件中test.h:view plaincopy to clipboard#ifndef TEST_INC #define TEST_INC #include using namespace std; #ifdef __cplusplus extern "C" { #endif extern void *__real_callocsize_t nmemb, size_t size; extern void *__real_reallocvoid *ptr, size_t size; extern void *__real_mallocsize_t size; extern void __real_freevoid *ptr; void *__wrap_callocsize_t numemb, size_t size; void *__wrap_reallocvoid *ptr, size_t size; void *__wrap_mallocsize_t size; void __wrap_freevoid *ptr; /* wrap calloc */ void * __wrap_callocsize_t numemb, size_t size { cout << "wrap alloc" << endl; return __real_callocnumemb, size; } /* wrap realloc */ void * __wrap_reallocvoid *ptr, size_t size { cout << "wrap realloc" << endl; return void*__real_reallocptr, size; } /* wrap malloc */ void * __wrap_mallocsize_t size { cout << "wrap malloc" << endl; return void*__real_mallocsize; } /* wrap malloc */ void __wrap_freevoid *p { cout << "wrap free" << endl; __real_freep; } #ifdef __cplusplus }; /* end of extern "C" */ #endif #endif /* ----- #ifndef TEST_INC ----- */ .cpp只需要加上這個頭文件view plaincopy to clipboard#include using namespace std; #include "test.h" int main { int allocTimes = 100; whileallocTimes-- { int *p = int*calloc5, sizeofint; //freep; } } 然后在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 去編譯一個文件執(zhí)行./test 即可發(fā)現(xiàn)alloc 和 free不匹配。此方法只是拋磚引玉。

熱門搜索
- 2018-07-318月8號成都出發(fā)去色達(dá),自駕游,有2個位置可以結(jié)伴
- 2018-07-31這地方熱嗎?莫干山不錯的,下渚湖怎樣熱不熱
- 2018-07-31兒童超過120m要買票嗎
- 2018-07-31準(zhǔn)備去大理旅游三天,從昆明出發(fā) 求大神推薦路線
- 2018-07-31從廈大學(xué)生公寓到南普陀寺怎么走,要多長時間到?
- 2018-07-31問一哈從宜賓到濟(jì)南,怎么走最劃算