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在...