愛悠閑 > 使用mtrace()函數檢內存溢出

使用mtrace()函數檢內存溢出

分類: linux  |  作者: buaa_shang 相關  |  發布日期 : 2014-06-08  |  熱度 : 431°

對于內存溢出之類的麻煩可能大家在編寫指針比較多的復雜的程序的時候就會遇到。Linux系統下有一個工具可以幫忙調試,這就是mtrace。mtrace主要能夠檢測一些內存分配和泄漏的失敗等。下面我們來學習一下它的用法(man mtrace)

1.在需要跟蹤的程序中需要包含頭文件<mcheck.h>,而且在main()函數的最開始包含一個函數調用mtrace()。由于在 main函數的最開頭調用了mtrace(),所以該進程后面的一切分配和釋放內存的操作都可以由mtrace來跟蹤和分析。

2.定義一個環境變量,用來指定一個文件,該文件用來輸出log信息。如下的例子:$export MALLOC_TRACE=mymemory.log

        這里也可以在程序中設置:setenv("MALLOC_TRACE", "mymemory.log", 1);此語句放在mtrace()前就可以.

3.正常運行程序,此時程序中的關于內存分配和釋放的操作都可以記錄下來

4.然后用mtrace使用工具來分析log文件。例如:$mtrace testmtrace $MALLOC_TRACE

   (其中testmtrace為可執行文件)

見例子:

#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char *hello;
        mtrace();
        hello = (char*)malloc(20);
        sprintf(hello, "hello world!");
        return 1;
}

[email protected]:~/Cpro$ gcc testmtrace.c -o testmtrace
[email protected]:~/Cpro$ ./testmtrace
[email protected]:~/Cpro$ mtrace testmtrace mytrace.log

Memory not freed:
-----------------
   Address     Size     Caller
0x092aa378     0x14  at 0x804846e                                            這是 產生界過,顯示內存沒有被釋放.

改動一下程序:

#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char *hello;
        mtrace();
        hello = (char*)malloc(20);
        sprintf(hello, "hello world!");
        free(hello);                  //新增釋放內存
        return 1;
}
[email protected]:~/Cpro$ gcc testmtrace.c -o testmtrace
[email protected]:~/Cpro$ ./testmtrace
[email protected]:~/Cpro$ mtrace testmtrace mytrace.log
No memory leaks.                                                                                    結果是沒有內存leak


附: setenv()函數說明.

setenv(改變或增加環境變量)
相關函數 getenv,putenv,unsetenv
表頭文件 : #include<stdlib.h>
定義函數 : int setenv(const char *name, const char * value,int overwrite);
函數說明 : setenv()用來改變或增加環境變量的內容。參數name為環境變量名稱字符串。
參數 : value則為變量內容,參數overwrite用來決定是否要改變已存在的環境變量。如果overwrite不為0,而該環境變量原已有內容,則原內容會被改為參數value所指的變量內容。如果overwrite為0,且該環境變量已有內容,則參數value會被忽略。
返回值 : 執行成功則返回0,有錯誤發生時返回-1。



快乐彩中奖说明