malloc stats 檢查記憶體洩露的神器

2022-08-25 17:54:28 字數 1591 閱讀 3311

本文**於:

valgrind可以用來檢測記憶體洩露,但在使用中,往往會遇到一些問題,給除錯工作帶來很多不必要的麻煩,我自己遇到的有以下兩種:

(1)記憶體洩露誤檢(系統初始化時,可能有一些需要長期儲存在記憶體中的資料結構,這些空間是永遠不釋放的,而這些記憶體會被認為絕對洩露)

(2) valgrind檢查記憶體洩露過於全面,執行後的結果太多往往很難從中找到有用的資訊。有時候,我們只需要關注某些函式,可能在執行某個操作,呼叫某些函式時會出現記憶體洩露,此時,valgrind的工作顯得冗餘而複雜

系統庫函式中提供了malloc_stats()函式,可以統計本程序具體的記憶體使用情況,精確到位元組,malloc_stats()函式宣告如下:

#include

void malloc_stats(void);

malloc_stats()執行結果如下:

arena 0://第乙個arena(每個執行緒分配乙個arena),這裡只有乙個執行緒

system bytes     =     135168//本執行緒從作業系統獲得的動態記憶體,這裡是132kb

in use bytes     =       1152//本執行緒在使用的動態記憶體,1152位元組

total (incl. mmap)://總的使用情況,各個執行緒使用動態記憶體的累加值

system bytes     =     135168//本程序從作業系統獲得的動態記憶體,這裡是132kb

in use bytes     =       1152//本程序在使用的動態記憶體,1152位元組

max mmap regions =          0//當一次申請記憶體超過128kb(32位作業系統)或1mb(64位作業系統)時,會增加mmap區域,這裡統計使用mmap區域的個數

max mmap bytes   =          0//mmap區域對應記憶體大小

不說廢話,來段**看看效果

//test_malloc_stats.c  

#include#includeint func1();

int main()

printf("********before call func1 **********\n");

malloc_stats();//在要執行記憶體檢測的函式之前列印記憶體資訊

func1();

printf("\n@@@@@@@@after call func1 @@@@@@@@@@@\n");

malloc_stats();//在要執行記憶體檢測的函式之後列印記憶體資訊

free(p);

return 1;

}

int func1(void)//申請1024位元組,但沒有釋放,有記憶體洩露

return 0;

}

如上圖,在呼叫func1之前,記憶體使用位112b,呼叫之後,記憶體使用1152b,增加了1040位元組,說明函式func1存在記憶體洩露,此時檢查func1函式**即可。如果func1確實會造成1040b的記憶體使用,這就說明func1沒有問題。

這裡,您可能會發現申請了1024位元組,實際記憶體占用1040位元組,這正是glib庫的實現,另外的16位元組用來管理分配的資料塊

記憶體檢查工具

記憶體檢測工具主要用於檢測程式的堆疊錯誤。一般的檢測方法是通過加magic number來表示正確的記憶體資訊。如果magic number被寫壞,那麼就表示記憶體錯亂了。1編譯選項 fstack protector fstack protector all fstack protector 在函式...

如何檢查記憶體洩露

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

vc記憶體洩露檢查

mfc檢測記憶體洩露是最方便的,只要在需要檢測的cpp檔案開始包含 ifdef debug define new debug new endif 就可以了。這是通過過載new操作符,在debug時可以在output中輸出記憶體洩露的位置。非mfc中檢測記憶體洩漏需要加上 ifdef debug de...