利用mtrace檢查記憶體洩漏

2021-05-24 14:09:44 字數 1685 閱讀 8374

mtrace是linux下檢查記憶體洩漏的工具之一。

它實際上是通過一對函式來檢測一段**是否存在記憶體洩漏:

mtrace()與muntrace()。

它們的原型如下:

void mtrace(void);

void muntrace(void);

標頭檔案為:mcheck.h

用法:1. 首先確定需要檢測那一段**

2. 然後再在這段**的前面呼叫mtrace(),在這段**之後呼叫muntrace()。

3. 設定環境變數:malloc_trace,可以在程式編譯好後通過命令:

export malloc_trace=./log   //其中log是用來存放記憶體洩漏資訊的日誌檔名。

也可以在呼叫mtrace()之前呼叫函式設定環境變數:setenv("malloc_trace", "log", 1);

4. 編譯並執行程式,這樣記憶體洩漏資訊就會寫到log檔案中。

5. 檢視log檔案,如:cat log

注意: 一般情況下不要呼叫muntrace, 而讓程式自然結束. 因為可能有些釋放記憶體**要到muntrace之後才執行.

例項:#include

#include

#include

int main(void)

setenv("malloc_trace", "log", 1);   //設定環境變數malloc_trace

mtrace();   //在需要檢測的**段之前呼叫mtrace函式

char *str1 = (char*)malloc(10);

char *str2 = (char*)malloc(10);

if((null == str1) || (null == str2))

perror("can't allocate memory");

muntrace();    //在需要檢測的**段之後呼叫muntrace函式

return 0;

將上面的程式編譯執行後會在當前目錄下產生乙個記錄=記憶體洩漏的檔案log,其內容如下:

(「+」表示申請的記憶體,「-」表示釋放的記憶體)

= start

@ ./test:[0x8048534] + 0x9ed1418 0xa

@ ./test:[0x8048542] + 0x9ed1428 0xa

= end

= start

@ ./test:[0x8048564] + 0x91ab418 0xa

@ ./test:[0x8048572] + 0x91ab428 0xa

@ ./test:[0x804859c] - 0x91ab418

= end

上面的資訊表示:程式申請了兩塊記憶體0x91ab418和0x91ab428,但只釋放了記憶體0x91ab418 。故也存在記憶體洩漏。

當然如果加上free(str1); 與free(str2);則log內容如下:

= start

@ ./test:[0x8048564] + 0x809b418 0xa

@ ./test:[0x8048572] + 0x809b428 0xa

@ ./test:[0x804859c] - 0x809b418

@ ./test:[0x80485a4] - 0x809b428

= end

這表示申請的記憶體都釋放掉了,故不存在記憶體洩漏。

mtrace檢查記憶體洩漏

記憶體洩漏檢查方法 for linux 如果你更想讀原始文件,請參考glibc info的 allocation debugging 一章 執行info libc glibc提供了乙個檢查記憶體洩漏的方法,前提是你的程式使用glibc的標準函式分配記憶體 如malloc,alloc.1.在需要記憶體...

mtrace 檢查記憶體洩漏

mtrace 可以用來檢查記憶體洩漏。它利用 malloc hook機制,記錄每乙個記憶體分配的呼叫,在利用gcc的 builtin return address 獲得函式的呼叫位址,生成log檔案。最後通過 程式中的除錯資訊和日誌檔案找出發生記憶體洩漏的函式。記住程式編譯時要帶上除錯資訊,不然只有...

c記憶體洩漏檢查工具 mtrace

專案中出現記憶體洩漏是讓人很頭疼的事情,使用了vargrind效果不明顯,可能因為試用了libuv裡面有太多非同步處理,導致使用vargrind會出現段錯誤。後來發現mtrace,使用還是挺簡單的。mtrace是gnu自帶的庫,因為我的專案是嵌入式開發,使用arm平台,剛開始想交叉編譯mtrace在...