valgrind是个好工具

          编程是碰到最麻烦的问题恐怕就是内存泄露了,内存泄露问题往往不易发现,特别是在内存泄露的大小很小的情况下,如果不是程序长时间运行,恐怕很难发现,而调试内存泄露的问题也常常显得相当困难,最传统的办法恐怕就是一行行地去检查代码了,而对于工程项目,往往涉及到很多人的工作,而且代码量也是相当可观的,要检查内存泄露问题,靠一行行地读代码恐怕是相当头疼的事情(虽然本人也做个这种傻事,囧...ps:后来发现是编写rpc上层调用时,传递的参数是通过malloc产生的,而rpc调用的free函数并不会主动释放在程序中malloc申请的空间,从而导致严重的内存泄露)。ok,看看有什么工具可以帮助我们解决内存泄露的问题吧。

  • valgrind工具

这个工具是开源的,可以下载到安装包,在linux上安装

1.解压bzip2 -d valgrind,x,x,x

2.进入安装目录配置./configure(不要加什么--prefix参数指定安装路径,我指定了以后make出现异常,不指定就ok,当然,也可能是和机器有关,暂时忽略)

3.make&&make install

4.用valgrind -h看看这个工具的参数和用法


        检查内存泄露命令(利用memcheck工具)valgrind --tool=memcheck --leak-check=yes ./test就可以检查test程序的内存泄露问题了。

        使用该命令可以打印出应用程序申请内存和是否内存的情况,应该重点关注definitely lost标注出的函数块,这部分的代码是指申请了内存空间后,指向该部分的内存空间的指针没有free就直接指向其他内存空间或是直接被丢弃了,没有free该指针申请的空间,这类申请最易出现内存泄露情况。

其实valgrind只能提供申请内存异常的函数,具体的分析还是由程序员自己分析,由于它没有具体打印每个指针的申请和释放情况,所以分析起来还是不够方便(找了好久才定位到问题!),不知道是否有工具能够将程序申请的指针malloc和free配对地打印出来,这样更易于分析。

       对于free空间异常的问题,常常令人头疼,在gdb调试环境下,你无法知道一个指针指向的空间到底有多大,是否有其他的变量越界访问了这个空间,如果直接使用free,可能出现段错误,而在gdb下打印你free的指针又是完全正确的,这个时候就可以用valgrind帮你查看内存越界问题了,valgrind会在存在内存越界的block中打印Invalid write of size提示你,你的代码存在内存越界问题,然后,一切就简单多了~~


参考资料:

1.http://blog.csdn.net/bluebeach/article/details/6000413 (介绍definitely lost,indirectly lost等概念)

2.http://www.cnblogs.com/qianxun/archive/2011/04/26/2029353.html (安装和命令说明)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值