兩個內存調試工具

一.動態內存分配是一個很容易出現程序漏洞的領域,且一旦出錯不易查找.這些錯誤通常由兩種原因引起:

1.指針malloc()分配的內存的指針值發生變化,又沒有別的指針指向它,那麼這塊內存在程序退出將變得無法訪問.

2.在一個已分配的內存塊前或後寫數據,很可能會損壞malloc函數庫用於記錄分配情況的數據結構.出現這種情況後,過一段時間後,再調用malloc或free都可能失敗而引起程序崩潰,要找這類錯誤的發生地點和準確時間是困難的,因爲錯誤的發生是在很久以前.

有很多工具可以幫助發現這些錯誤,例如Electricfence和valgrind

二.

1.Electricfence

Electricfence嘗試用linux的虛擬內存機制來保護malloc和free所使用的內存,當它發現內存被破壞時停止程序運行.這個程序不是linux自帶的,我們需要從網上下載(可以使用ubuntu的Synaptic Package Manager軟件安裝)

下面的程序efnece.c調用malloc分配了1024字節的內存,程序試圖寫這塊內存後的第一個字節

/*efence_test.c*/

#include <stdlib.h>
int main()
{
    char *ptr = (char *)malloc(1024);
    
    ptr[0] = 0;
    ptr[1024] = 0;


    return 0;
}

gcc編譯運行後沒有發現任何異常,但malloc所分配的內存可能已被破壞,我們遲早會遇到麻煩

安裝Electricfence後,就可以在編譯時加入efence庫

gcc -g -o efence_test efence_test.c -lefence

2.valgrind

valgrind工具能檢測到前面所說的錯誤,還能檢測到數組越界錯誤,這個軟件也不是linux自帶的,需要到http://developer.kde.org/~sewardj上找到.(ubuntu系統也可以通過Synaptic Package Manager軟件安裝)

使用valgrind工具不需要重新編譯,它還可以用來調試一個正在運行的程序

/*checher.c*/

#include <stdlib.h>

int main()
{
    char *ptr = (char *)malloc(1024);
    char ch;
    
    ch  = ptr[1024];
    ptr[1024] = 0;
    ptr = 0;

    return 0;
}

編譯好checher後,直接用命令valgrind --leak-check=yes -v ./checker



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章