概述
最近有需求要分析定位下开发的文件存储网关的内存泄露问题,对比了几款后选择了valgrind
这款工具,功能很是强大,这里我还只使用了一些基本的功能,记录如下。
Valgrind
支持很多工具: Memcheck
,Addrcheck
,Cachegrind
,Massif
,Helgrind
和Callgrind
等。
安装
1 | $ wget ftp://sourceware.org/pub/valgrind/valgrind-3.13.0.tar.bz2 |
使用与分析
1 | $ valgrind --help |
常用命令格式:
1 | $ /usr/local/bin/valgrind --log-file=mylog ./file-gateway |
valgrind
的memcheck
组件支持的内存泄露检查大概有:
- 读写非法的内存
- 访问未初始化的内存
- 访问已经释放了的内存
- 申请的内存没有释放
- 重复释放内存
- 释放非法内存
source
和destination
内存的重叠
uninitialised byte(s)
检查出程序中未初始化而访问的变量
1 | ==1350634== Thread 14: |
1 | ==1350634== Thread 19: |
Invalid read/write
读取非法地址,通常是继续访问释放后的内存空间
1 | ==1346085== Thread 14: |
SUMMARY
在valgrind
最后会有内存分析的总结
1 | ==1366931== HEAP SUMMARY: |
LEAK SUMMARY
:内存泄露信息的总结,详细信息从前面的log中查找
definitely lost
: 肯定丢失的内存,这部分必须处理indirectly lost
: 间接丢失的内存,可能是一个structure
里指向的内存possibly lost
: 可能丢失的部分,这是由于C/C++语言指针处理的特点造成的,可能不太准确still reachable
: 程序可能是ok的,可以配置--show-reachable=no
不显示这部分
若想显示泄露内存的详细信息,使用参数--leak-check=full
/usr/local/bin/valgrind --leak-check=full --log-file=mylog ./flle-gateway
1 | ==1373210== HEAP SUMMARY: |
参考
http://valgrind.org/docs/manual/manual.html
http://www.oschina.net/translate/valgrind-memcheck
https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/