内存检查工具valgrind

1. valgrind概述

Valgrind是一套Linux下的开放源代码的仿真调试工具的集合。valgrind由内核以及基于内核的其他调试工具组成。

Valgrind包括以下的一些工具:

  • Memcheck:一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况(比如使用未初始化的内存、使用已经释放了的内存、内存访问越界等)
  • Callgrind:收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行Cache模拟
  • Cachegrind:主要用来检查程序中缓存使用出现的问题
  • Helgrind:主要用来检查多线程程序中出现的竞争问题
  • Massif:堆栈分析器,能测量程序在堆栈中使用了多少内存,告诉我们堆块、堆管理块和栈的大小
  • Extension:可以利用Core提供的功能,自己编写特定的内存调试工具

在了解valgrind之前可以了解一下Linux程序内存空间布局

2. valgrind安装

首先,下载安装包(注意下当前最新版本的valgrind,否则后面会报错):

wget http://www.valgrind.org/ddownloads/valgrind-3.14.0.tar.bz2

内存检查工具valgrind_第1张图片
解压安装包:

tar xvf valgrind-3.14.0.tar.bz2

内存检查工具valgrind_第2张图片
进入目标文件夹:

cd valgrind-3.14.0

指定安装路径和生成makefile:

./configure --prefix=/home/ubuntu/valgrind //这里仅为本人路径
//未下载最新安装包,可能报如下错误
configure: error: please use gcc >= 3.0 or clang >= 2.9 or icc >= 13.0

执行make与make install :

make
make install

3. valgrind使用

//test.cpp
#include 
#include 
using namespace std;
void func() {
    int *x = (int *)malloc(10 * sizeof(int));
    x[10] = 0;
}
int main()
{
    func();
    cout << "done" << endl;
    return 0;
}

用g++编译,得到可执行文件test:

 g++ -g -o test test.cpp

在这里插入图片描述

使用Valgrind分析,执行如下命令:

./valgrind/bin/valgrind --tool=memcheck --leak-check=yes --show-reachable=yes  ./test

由于我安装的valgrind是存放在表目录,所以./进入目录到/bin/valgrind文件下才能有效使用valgrind,后面的--tool=tool name是指定具体的工具,./test执行文件:
内存检查工具valgrind_第3张图片

对该结果进行简要的分析:

  • 首先,下图左边显示类似行号的数字(28473)表示的是进程id,在其下面的是Valgrind的版本信息:
    在这里插入图片描述
  • 进一步分析:
    下面的提示了Valgrind通过运行被测试程序发现的一些内存问题:
    1)这是一个对内存的非法写操作,非法写操作的内存是4Byte
    2)发生错误时的函数堆栈,具体的源代码行号是第6行
    3)非法写操作的具体地址空间
    内存检查工具valgrind_第4张图片
    下面是对发现的内存问题和内存泄漏问题的总结。程序结束时,内存泄漏了40Byte的内存:
    内存检查工具valgrind_第5张图片

使用Valgrind可以检查以下一些常见的内存错误使用情况:

  • 使用未初始化的内存 :主要是局部变量以及动态申请的变量,其初始值为随机值,使用这些变量将引发内存错误
  • 内存读写越界:指访问了没有权限访问的内存地址空间
  • 内存覆盖:比如C库中有些函数可直接操作内存,容易引发内存覆盖
  • 动态内存管理错误:1)申请和释放不一致 2)申请和释放不匹配 3)释放后仍然读写
  • 内存泄漏:指在程序中动态申请的内存,在使用完既没有释放,又无法被程序的其他部分访问

------------------------------------------get----------------------------------------------
valgrind的使用

你可能感兴趣的:(【linux学习】)