mtrace檢查記憶體洩漏

2021-09-08 04:55:50 字數 1304 閱讀 5759

記憶體洩漏檢查方法(for linux) 

如果你更想讀原始文件, 請參考glibc info的"allocation debugging" 

一章 (執行info libc);

glibc提供了乙個檢查記憶體洩漏的方法, 前提是你的程式使用glibc的標準函式分配記憶體(如malloc, alloc...):

1.在需要記憶體洩漏檢查的**的開始呼叫void mtrace(void) (在mcheck.h中有宣告)。mtrace為malloc等函式安裝hook, 用於記錄記憶體分配資訊。

在需要記憶體洩漏檢查的**的結束呼叫void muntrace(void)。注意: 一般情況下不要呼叫muntrace, 而讓程式自然結束. 因為可能有些釋放記憶體**要到muntrace之後才執行。

2. 用debug模式編譯被檢查**(-g或-ggdb) 

3. 設定環境變數malloc_trace為一檔名, 這一檔案將存有記憶體分配資訊. 

4. 執行被檢查程式, 直至結束或muntrace被呼叫. 

5. 用mtrace命令解析記憶體分配log檔案($malloc_trace) 

(mtrace foo $malloc_trace, where foo is the executible name) 

如果有記憶體洩漏,mtrace會輸出分配洩漏 

記憶體的**位置,以及分配數。

rpm -ivh glibc*.src.rpm

cd /usr/src/redhat/specs/

rpmbuild -ba glibc-9.spec 

cd /var/tmp/glibc-2.3.2-root/usr/bin/

cp mtrace /usr/bin/

除錯方法如下:

vi a.c

1 #include

2 3 int main()

4 $gcc -g a.c #記得編譯帶-g除錯選項 

$export malloc_trace=a.log 

$./a.out 

$unset malloc_trace #記得執行完後unset變數,否則可能執行其他命令可能覆蓋log 

$mtrace a.out a.log 

memory not freed:

-----------------

address     size     caller

0x09b08378      0xa  at /***/a.c:6

0x09b08388     0x10  at /***/a.c:7

可以看到,會顯示未釋放動態空間的**具體位置.

**:

mtrace 檢查記憶體洩漏

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

利用mtrace檢查記憶體洩漏

mtrace是linux下檢查記憶體洩漏的工具之一。它實際上是通過一對函式來檢測一段 是否存在記憶體洩漏 mtrace 與muntrace 它們的原型如下 void mtrace void void muntrace void 標頭檔案為 mcheck.h 用法 1.首先確定需要檢測那一段 2.然後...

c記憶體洩漏檢查工具 mtrace

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