valgrind调查内存leak

快有几个月没更新了,记录一下最近解决问题用到的工具吧.

最近代码跑压力测试,总是发现内存在无规律的慢慢增加,因此在Android上用上了大名顶顶的valgrind,说实话,真是名不虚传,

真是建议以后所有c/c++ 项目,不管有没有现象级的问题,用这个跑一下检测下一些隐藏得比较深的问题;

export G_SLICE=always-malloc

export G_DEBUG=gc-friendly

注:Android 4.4中跑valgrind ,把external中编译的valgrind拷贝到

/data/valgrind目录,然后设置环境变量才能使用:

export VALGRIND_LIB=/usbdisk/valgrind

 参考命令行:

valgrind -v --tool=memcheck  --track-fds=yes  --leak-check=full --show-reachable=yes --time-stamp=yes --undef-value-errors=no --malloc-fill=0xc --free-fill=0xd --freelist-vol=100000000 --trace-children=yes --num-callers=50  --suppressions=default.supp  --log-file=valgrind_gst ./cmdplayer -p gstreamer http://10.9.44.116/test.mp4

注:

Android 的external目录下有valgrind的源代码,mm 编译后拷贝到板子上就可以使用valgrind了.

1,生成supp文件

supp文件可以定义valgrind的检查过滤规则。如果你确实用过valgrind,你会发现其对内存的检查非常严厉,很容易存在误报(其实也不是误报,有时候那些错误只是你不关注的),尤其是对于libc中的malloc与free(好像还有new和delete,另外这个是个很tricky的地方,按照文档的意思是,libc里面malloc时,会额外分配一点内存用于某些事情来保证malloc的工作,而这些额外的内存不会被free释放掉,因为当线程释放的时候,linux内核会将这些额外的内存给释放了,从而内存检测工具的检查会被影响)以及一些其他的库(比如ACE?)。为了消除这些干扰信息,你需要生成supp文件。最简单的办法就是在启动valgrind的时候加上选项--gen-suppressions=all,再将生成的规则复制出来。当然,这不是一个聪明的办法。最好是将生成的结果整理一下,将多个相似的整理成一条。可以参考官方文档suppressing errors

2,对程序的影响

如果你编写的只是小型程序,你可以不关注这一部分。但如果是大型程序(尤其对性能有要求的)或者是多线程程序(大型程序应该都这样吧),你的程序会工作起来后有些不同。第一,变的非常非常慢。valgrind模拟的一个软CPU,将可执行程序运行在其中。所以效率很低,速度慢很多,而且,valgrind的是单线程的(应该是),它会将你程序的所有线程统一管理起来,其实就是强制串行起来执行。所以你一定要明白这一点,用valgrind跑你的程序时,如果testcase挂掉了,看看是不是和性能有关的那些。

另外,请注意,64位的valgrind,不能执行32位的程序。这一点我没有严格验证过,也可能是版本没有更新的原因,至少在我调试时,64位的rhel系统下,产品的64位的程序会创建2个32位的子进程,然后挂在那里,没有错误也没有警告。

3,多进程追踪

如果你只是一个单一的小程序,不用开子进程,valgrind挺好用的。如果你要用valgrind去追踪多进程程序中的内存泄露,就有点繁琐了。有几个选项要特别注意。

--trace-children=yes  这个是必须的,打开追踪子进程

--log-file=<filename> --xml-file=<filename> 文本格式报告和xml格式报告的报告名称,推荐使用%p_log.memcheck之类的名字,%p会被valgrind转义成进程号,这样每一个进程都拥有一份独立的报告。

--child-silent-after-fork=yes  这个看情况,如果不打开的话,报告会更详细,错误定位可能会更精准,但是多份报告会混杂在一起,会直接破坏xml格式的报告

--trace-children-skip=patt1,patt2,...  --trace-children-skip-by-arg=patt1,patt2,... 如果不使用这个,valgrind会追踪所有子进程,哪怕这个进程是java的。所以对应的,你需要让valgrind过滤一些子进程,--trace-children-skip是根据exec的file/path中的字符串匹配来过滤,--trace-children-skip-by-arg是根据exec的argv参数来过滤。没有正则表达式,只有*,?匹配两个符号可用。

另外,对于被执行程序而言,valgrind是other权限组的,所以记得更改执行权限。然后valgrind的报告会生成在,启动valgrind时用户所在的目录处。子进程的报告会生成在子进程程序所在目录。例如如果java在/bin/下,这报告会生成在/bin/里。但如果valgrind没有su权限,则报告会无法生成。

4,报告结果显示

其实valgrind的报告结果是很详细的。但是不要认为那些开发team愿意去一条条阅读valgrind的内存错误结果报告。所以,图形化显示结果是很重要的。幸运的是,Jenkins中已经包含了valgrind插件,而且非常好用。

安装valgrind插件:进入系统管理,插件管理中,在可选插件中搜索valgrind,然后安装即可。

配置valgrind插件:插件的默认工作目录是Jenkins的工作目录,所以要显示结果需要将valgrind的报告结果复制入Jenkins的工作目录。这里需要的报告结果是xml格式的。Report Pattern:   设置检索报告的命名格式,一般生成的报告如果是%p_log.memcheck,那么这里就设置为*_log.memcheck.

配置好之后,在配置的下方,会出现valgrind Results。当每次构建完成之后,点击进入后都可以看到当前内存错误数量的图表,以及每个错误的函数名、函数调用关系等。

时间: 2024-08-10 02:43:25

valgrind调查内存leak的相关文章

使用valgrind检查内存

工欲善其事,必先利其器.Valgrind作为一个免费且优秀的工具包,平时大部分人可能都是使用valgrind检测内存问题,如内存泄露,越界等.其实Valgrind的用途远不止于此,其实际上为一个工具包,除了检查内存问题以外,还有其它多项用途.我准备将其大致介绍一下.本不想再介绍Valgrind检测内存问题的用法的,但是又一想,毕竟这是Valgrind的一个最有名的用途,如果少了它,不免有些遗憾,所以还是把检查内存问题作为第一篇吧. 请看一下代码: #include <stdlib.h> #in

转: 使用valgrind检查内存问题

作者:[email protected] 博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net 本文的copyleft归[email protected]所有,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途. ========================================================================================

xenserver6.2 内存leak故障处理

从日志来看,系统内存leak导致out of memory. Oct 30 14:22:35 xenserver-21622 kernel: [36474919.505097] lowmem_reserve[]: 0 0 0 0 Oct 30 14:22:35 xenserver-21622 kernel: [36474919.505104] DMA: 566*4kB 3*8kB 6*16kB 1*32kB 1*64kB 0*128kB 0*256kB 1*512kB 0*1024kB 0*20

Linux/Unix用valgrind检测内存泄漏

c\c++编程中,内存管理是比较头疼的问题,一不小心就会造成内存泄漏,除了养成良好的编程习惯外(使用智能指针等),使用工具也能帮助检测内存泄漏,valgrind是Unix\Linux下一款不错的工具.(mac下暂时有bug) Valgrind 安装 到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2 解压安装包:tar –jxvf valgrind-3.2.3.tar.bz2 解压后生成目录valgrind-3.2.3 cd valgrind-3.2.3 运

valgrind查找内存泄漏问题

程序运行一晚上,早晨一看,出现了Killed信息,然后在网上查找一下,说应该是程序占用资源过高,被系统终止了. 然后我又运行一段时间,看内存果然涨到了使用率40%多,然后就开始查找内存泄漏的问题,由于程序本来就不大,我手动 在代码中找new和malloc,然后又找delete和free,找到了两处,然后修正了. 但是运行一段时间还是在涨,虽然涨的慢了,但是还是有问题,于是就想到了用valgrind.\ 第一次使用的时候是用的 valgrind + 程序,这样运行的,但是发现信息好像太少了,于是改

valgrind 检查内存泄漏

内存泄漏是coding中经常容易出现的问题, 而且很难查. 本文中总结了几个常见的内存泄漏问题, 分别举例实现, 并列出用代码分析工具--valgrind中memcheck检查的结果, 一 一对错误进行排查. 本文围绕工程valgrind-sample进行讲解. 先看下工程结构: methods类写了几个可能存在内存操作问题的函数, main.cpp调用methods类函数: methods.h: #ifndef VALGRIND_METHODS_H #define VALGRIND_METHO

使用valgrind定位内存泄露

简单备忘一下,valgrind的用法: valgrind --tool=memcheck --leak-check=full --log-file=a.log ./a.exe 其中: --tool指定工具: --leak-check指定检测级别: --log-file指定输出到文件,不给出这个字段则输出到屏幕打印. valgrind的错误含义:(转自http://blog.csdn.net/ai2000ai/article/details/51131645) Conditional jump o

Qt creator 搭配 valgrind 检测内存泄漏

继上次重载operator new检测内存泄漏失败之后,妥协了.决定不管是否是准确指明哪一行代码出现内存泄漏,只要告诉我是否有泄漏就行了,这样就没有new替换的问题.在开发中,总是一个个小功能的开发.如果开发完一个小功能告诉我有内存泄漏,那想必也是比较容易找的. 这次的想法是重写operator new,然后每次new的时候记录一下地址及申请内存的大小,释放时删除记录.这样,程序结束时剩余的记录就是泄漏的了.记录的数据结构首选STL的map.结果,在记录时,map需要申请内存,调用new,new

valgrind测试程序内存泄漏问题

1.用wincap将valgrind放入系统任意路径下,解压 2.  登录主机后台在需要测试程序的路径下运行此行命令: /opt/valgrind/bin/valgrind ./itb(例) 3. 跑一段时间以后按ctrl+C以后退出查看信息 4.查看definitely lost信息 原文地址:https://www.cnblogs.com/jiahuifeng/p/10522077.html