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

最近代码跑压力测试,总是发现内存在无规律的慢慢增加,因此在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= --trace-children=yes --num-callers=  --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。当每次构建完成之后,点击进入后都可以看到当前内存错误数量的图表,以及每个错误的函数名、函数调用关系等。

valgrind调查内存leak的更多相关文章

  1. 使用valgrind检查内存

    Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,是公认的最接近Purify的产品,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试 ...

  2. Valgrind检测内存泄露简介

    原文地址: Valgrind 概述 体系结构 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核 ...

  3. Valgrind查找内存泄露利器

    Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析.你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的ma ...

  4. 用valgrind检查内存问题

    Valgrind Valgrind作为一个免费且优秀的工具包,平时大部分人可能都是使用valgrind检测内存问题,如内存泄露,越界等. Valgrind工具包包含多个工具,如Memcheck,Cac ...

  5. 转: 使用valgrind检查内存问题

    作者:gfree.wind@gmail.com 博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net    本文的copyleft归gfree ...

  6. Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题, Core Foundation 类型指针内存泄漏

    Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题   今天使用Analyze 看了下项目,   解决办法,项目中使用了ARC,OC的指针类型我们完全不考虑release的问题 ...

  7. Linux 下用 valgrind 查找内存泄漏小例子

    1.安装 valgrind yum install valgrind 2.测试用例 main.cpp #include <iostream> using namespace std; st ...

  8. valgrind massif内存分析[转]

    valgrind检查内存泄露 #valgrind   ./程序 内存泄漏问题,我们有memcheck工具来检查.很爽.但是有时候memcheck工具查了没泄漏,程序一跑,内存还是狂飙.这又是什么问题. ...

  9. Glib程序使用Valgrind查找内存泄露

    G_DEBUG=gc-friendly G_SLICE=always-malloc     //glib有缓存  故需使用 上述两条设置环境变量 G_SLICE和G_DEBUG排除由内存分配机制带来的 ...

随机推荐

  1. menuStrip鼠标经过自动显示菜单

    //--------------------------------------------------------------------------------- private void For ...

  2. Matlab中向量场的绘制

    % quiver(x,y,u,v) % x,y是包含坐标位置的矩阵,而u和v则是包含偏导数的矩阵. % 例如绘制f(x,y)=y-3x-2x^2-3xy-3y^2的方法: % 先用gradient函数 ...

  3. Bootstrap标签Tabs

    <!--标签--> <ul class="nav nav-tabs" role="tablist"> <li class=&quo ...

  4. JS断点调试

    断点调试在这种场景下能发挥很大的作用.上手这个办法也利益于我以前玩VB编程时也习惯了IDE的单步/断点调试,一般的纯Web开发入门的程序员我没看到几个会用的.其实难度不大,只是他们不懂得主动去探索 首 ...

  5. .Net使用程序发送邮件时的问题

    在做项目的时候,不可避免的会用到给用户发送邮件的问题,一开始我用的是qq的smtp服务器,但是会出错,不管账号密码,服务器地址端口等怎么配置都是出错.后百度之,发现可能是qq服务器本身就是禁止这个功能 ...

  6. Socket网络通讯开发总结之:Java 与 C进行Socket通讯(转)

    先交待一下业务应用背景:服务端:移动交费系统:基于C语言的Unix系统客户端:增值服务系统:基于Java的软件系统通迅协议:采用TCP/IP协议,使用TCP以异步方式接入数据传输:基于Socket流的 ...

  7. Kinect 1.8 体感开发,手势,姿态(Pose) 捕捉判断方法以及一些辅方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. TMS320F28335项目开发记录1_CCS的使用介绍

    CCS使用介绍 一.前言 本系列文章记录本人实际项目开发时对ti的DSP28335,以及CCS开发环境等的学习与记录,相对于2812来说,28335的资料还是比較少的,只是原理是相通的,28335说白 ...

  9. 【原】使用StarUML画用例图

    在写一份升级方案的时候,发现文字描述半天,好多句子,依然不容易被人看明白,使用visio画了个流程图,后来觉得画个时序图是最清晰得了. 于是在找了一个工具: startUML,当然,做时序图,建模之类 ...

  10. vue - path

    //path用来处理路径问题的. 1 const from = path.join(_dirname, './appes6/js'); => d:/Users/xxchi/Desktop/ES6 ...