1 valgrind 安装
1.1 valgrind安装包获取
http://www.valgrind.org/downloads/valgrind-3.14.0.tar.bz2
1.2 安装
tar -jxvf valgrind-3.14.0.tar.bz2
cd valgrind-3.14.0
./configure --prefix=/home/user1/valgrind
make
make install
如果安装的时候采用默认的安装路径,执行configure是可以不加配置–prefix参数
具体的安装方法可以参考解压包的README文档
2 valgrind使用
2.1 valgrind 用法
valgrind [options]prog-and-args
2.2 常用选项
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes --log-file=%p.log ./test args
其中–leak-check=full指的是完全检查内存泄漏,–show-reachable=yes是显示内存泄漏的地点,–trace-children=yes是跟入子进程,–log-file=%p.log是把泄漏信息记录在日志中,%p表示pid,args表示程序启动时所需要的参数
2.3 注意点
使用valgrind时,程序编译要加上-g选项,如果您的程序是会正常退出的程序,那么当程序退出的时候valgrind自然会输出内存泄漏的信息。如果您的程序是个守护进程,在足够的压测后程序可以用2号信号杀死,若2号信号不能杀死,可以改变程序的启动方式,去掉守护,以nohup的方式启动,最后在足够的压测后用2号信号杀死,得到内存泄漏的信息。注意程序不能用9号信号杀,用9号信号杀掉不会得到内存泄漏的信息
2.3.1 以nohup的方式启动
nohup valgrind --tool=memcheck --leak-check=full --show-reachable=yes --log-file=%p.log ./test --server_config=$server_config --server_log_properties=$server_log_properties >/dev/null 2>&1
2.3.2 足够的压测后用2号信号杀掉
ps -aux | grep test | grep -v grep | awk ‘{print $2}’ | xargs kill -2
2.4 使用vgdb 打印堆栈
启动选项 valgrind --leak-check=full --show-reachable=yes --trace-children=yes --log-file=%p.log --vgdb=yes --vgdb-error=0,在存在子进程的情况下,vgdb-error设置为0可能存在子进程无法拉起的情况,此时可以将vgdb-error的值设大,如2000
1、gdb program
2、target remote | vgdb --pid=pid_number
3、mo l f r a
3 demo
#include <iostream>
#include <string>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
using namespace std;
int main()
{
pid_t pid = -1;
pid = fork();
if(-1 == pid)
{
cout << "fork error" << endl;
}
else if(0 == pid)
{
cout << "child process" << endl;
int *p = new int[5];
// delete []p;
}
else
{
cout << "father process" << endl;
int *q = (int*)malloc(sizeof(int) * 5);
// free(q);
}
cout << "-------end flag-------" << endl;
while(1)
{
}
}
g++ multi_test.cpp -o multi_test -g
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes --log-file=%p.log ./multi_test
ctrl +c 相当发送2号信号,生成内存泄漏日志