內存檢測工具valgrind安裝及測試

本文轉自:peter tang


最近在學習數據結構的時候總是遇到關於內存錯誤的問題,因爲數據結構這塊多用指針,由此產生的段錯誤多不勝數,因此學習了一下valgrind這個工具,來檢測我們的程序是如何出現內存問題的。

centos系統下的valgrind,首先我們得有autoconf和automake兩個工具,一般系統都會自配。

安裝過程:

wget http://valgrind.org/downloads/valgrind-3.10.1.tar.bz2
tar -jxvf valgrind-3.10.1.tar.bz2
cd valgrind-3.10.1
./autogen.sh   (這一步可能遇上沒有安裝上面兩個工具的錯誤提示)
./configure
sudo make && make install
valgrind --version    (檢測版本,看是否安裝成功)

到此,我們的工具安裝成功。

我們在編譯程序的時候加上-g -fno-inline 保留調試信息。


測試命令:

$ valgrind --tool=memcheck --log-file=/home/yangni/var_log --leak-check=full --error-limit=no --show-leak-kinds=all ./a.out

–leak-check=full 指的是完全檢查內存泄漏。
–show-reachable=yes是顯示內存泄漏的地點。
–trace-children=yes:跟入子進程
–track-origins=yes:查看哪裏沒有進行初始化。當程序正常退出的時候valgrind自然會輸出內存泄漏的信息。
–log-file= 是存放詳細信息的日誌文件,我們將其顯示在終端可不要。/home/yangni/var_log 是我重定義的輸出路徑。


接下來用一個小程序測試一下:

#include <stdio.h>
void function()
{    
    int *p = (int*)malloc(10*sizeof(int));    
    p[10] = 0;
}
int main()
{    
    function();    
    return 0;
}

上面的程序很明顯沒有free而造成內存泄漏,內存泄露(Memory leak)指的是,在程序中動態申請的內存,在使用完後既沒有free,又無法被程序的其他部分訪問。內存泄露是在開發大型程序中最令人頭疼的問題,以至於有 人說,內存泄露是無法避免的。其實不然,防止內存泄露要從良好的編程習慣做起,另外,有工具幫助我們檢測更好!
這裏寫圖片描述


#include <stdio.h>
int main()
{    
    int a;    
    if (a==1)
    {        
        printf("a==%d\n",a);
        return 0;
    }
}

這裏寫圖片描述


#include <stdio.h>
int main()
{    
    int *a = (int*)malloc(5*sizeof(int));    
    a[5] = 1;    
    return 0;
}

這裏寫圖片描述

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