linux下檢查記憶體洩露的工具--mtrace

工程師WWW發表於2016-01-12

最令linux程式設計師頭疼的莫過於記憶體洩露了,即使你是在優秀的程式設計師,你也不能保證所以的malloc操作都有對應的free,那必要的工具就是必不可少的了。在一般的linux發行版中,有一個自帶的工具可以很方便的替你完成這些事,這個工具就是mtrace。

 

下面是它的用法

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.    
  5. #include <mcheck.h>  
  6.    
  7.    
  8. int main(){  
  9.     setenv("MALLOC_TRACE""output", 1);  
  10.     mtrace();  
  11.    
  12.     char * text = ( char * ) malloc (sizeof(char) * 100);  
  13.     memset(text,'/0',100);  
  14.     memcpy(text,"hello,world!",12);  
  15.    
  16.     printf("%s/n",text);  
  17.     return 0;  
  18. }  

 

可以看出,只需要在你的程式中插入三行程式碼,就行。

第一句,#include <mcheck.h>,包含標頭檔案

第二句,setenv("MALLOC_TRACE", "output", 1);output表示輸出的中間檔案

第三句,mtrace(),呼叫mtrace.

 

將這個檔案編譯,注意,編譯的時候一地要加上gcc的-g選項。

gcc mtrace_test.c -g -o mtrace_test

接著執行可執行檔案,然後你會發現當前目錄下多了一個output的檔案。

這個檔案自然不是文字檔案,所以需要工具來檢視。

 

$ mtrace mtrace_test output

 

這時會列印出一串資訊

- 0x000000000129a010 Free 3 was never alloc'd 0x7f62844d89ba
- 0x000000000129a100 Free 4 was never alloc'd 0x7f6284583a1d
- 0x000000000129a120 Free 5 was never alloc'd 0x7f62845d20ec
 
Memory not freed:
-----------------
           Address     Size     Caller
0x000000000129a5a0     0x64  at /home/dianping/peter/mtrace/mtrace_test.c:12

 

其它別的直接忽略,注意那句要命的 Memory not freed,caller表示那段程式碼對應的malloc操作沒有釋放。順便說一句,如果你編譯的時候沒有使用-g的選項,那麼Caller這個地方就不會出現程式碼的資訊,而是一串二進位制的地址資訊。

 

另外還有兩個工具據說也不錯dmalloc和memwatch,不過我沒用過,以後用到了在寫下使用方法吧

相關文章