valgrind 内存泄漏检测工具

valgrind 内存泄漏检测工具\Linux C,C++

名称:valgrind是一个调试和剖析的程序工具集。

概要用法:
valgrind [[valgrind] [options]] [your-program] [[your-program-options]]

描述:
Valgrind是一个Linux下灵活的调试和剖析可执行工具。它由在软件层提供综合的CPU内核,和一系列调试、剖析的工具组成。架构是模块化的,所以可以在不破坏现有的结构的基础上很容易的创建出新的工具来。例如我们原来有一个程序sec_infod,这是一个用gcc –g参数编译的程序,运行它需要:#./a.out
如果我们想用valgrind的内存检测工具,我们就要用如下方法调用:

valgrind --leak-check=full --show-reachable=yes --trace-children= yes  ./aa.out (2>logfile加上会好些,程序在执行期间stderr会有一些输出。提示比较多)不保存日志

--leak-check=full指的是完全检查内存泄漏,

--show-reachable=yes是显示内存泄漏的地点,

--trace-children=yes是跟入子进程。

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --track-origins=yes --log-file=memcheck.log -v ./可执行文件 参数   保存日志

如果您的程序是会正常退出的程序,那么当程序退出的时候valgrind自然会输出内存泄漏的信息。如果您的程序是个守护进程,那么也不要紧,我们 只要在别的终端下杀死memcheck进程(因为valgrind默认使用memcheck工具,就是默认参数—tools=memcheck):

#killall memcheck

这样我们的程序(./a.out)就被kill

2,检查代码覆盖和性能瓶颈:
我们调用valgrind的工具执行程序:

#valgrind --tool=callgrind ./sec_infod

会在当前路径下生成callgrind.out.pid(当前生产的是callgrind.out.19689),如果我们想结束程序,可以:

#killall callgrind

然后我们看一下结果:

#callgrind_annotate --auto=yes callgrind.out.19689  >log
#vim log

输出解读

内存访问越界:Invalid write of size 4 或者 Invalid read of size 1
踩内存:Source and destination overlap in memcpy
重复释放:Invalid free() / delete / delete[]
非法指针:Use of uninitialised value of size 4
由于非法指针赋值导致的程序崩溃:Process terminating with default action of signal 11 (SIGSEGV)

性能检测(调优)

valgrind --tool=callgrind -v ./可执行文件 参数

输出 callgrind.out.PID 文件
双击打开,如提示需要安装文件则安装

检测泄露的方法
1、用valgrind检测泄漏的具体位置,然后改正(一般只修改 definitely lost),改正完再用valgrind检测
2、如果还有泄漏,但是分析不出明确原因,长时间跑一下(比如半天,一天等),看看是否有内存持续增加的现象(原因:valgrind有时候有误报)

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值