valgrind检测内存泄漏

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号信号,生成内存泄漏日志
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值