内存检测工具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;
}

这里写图片描述

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