版权声明:本文为博主原创文章,转载请注明出处-- https://blog.csdn.net/qq_38790716/article/details/85133118
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
解压安装包:
tar xvf valgrind-3.14.0.tar.bz2
进入目标文件夹:
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 <iostream>
#include <stdlib.h>
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
执行文件:
对该结果进行简要的分析:
- 首先,下图左边显示类似行号的数字(28473)表示的是进程id,在其下面的是Valgrind的版本信息:
- 进一步分析:
下面的提示了Valgrind通过运行被测试程序发现的一些内存问题:
1)这是一个对内存的非法写操作,非法写操作的内存是4Byte
2)发生错误时的函数堆栈,具体的源代码行号是第6行
3)非法写操作的具体地址空间
下面是对发现的内存问题和内存泄漏问题的总结。程序结束时,内存泄漏了40Byte的内存:
使用Valgrind可以检查以下一些常见的内存错误使用情况:
使用未初始化的内存
:主要是局部变量以及动态申请的变量,其初始值为随机值,使用这些变量将引发内存错误内存读写越界
:指访问了没有权限访问的内存地址空间内存覆盖
:比如C库中有些函数可直接操作内存,容易引发内存覆盖动态内存管理错误
:1)申请和释放不一致 2)申请和释放不匹配 3)释放后仍然读写内存泄漏
:指在程序中动态申请的内存,在使用完既没有释放,又无法被程序的其他部分访问
------------------------------------------get----------------------------------------------
valgrind的使用