快速业务通道

防止内存泄露 Linux下用Valgrind做检查

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-18

  用C/C 开发其中最令人头疼的一个问题就是内存管理,有时候为了查找一个内存泄漏或者一个内存访问越界,需要要花上好几天时间,如果有一款工具能够帮助我们做这件事情就好了,valgrind正好就是这样的一款工具.

  Valgrind是一款基于模拟linux下的程序调试器和剖析器的软件套件,可以运行于x86, amd64和ppc32架构上.valgrind包含一个核心,它提供一个虚拟的CPU运行程序,还有一系列的工具,它们完成调试,剖析和一些类似的任务.valgrind是高度模块化的,开发人员或者用户可以给它添加新的工具而不会损坏己有的结构.

  valgrind的官方网址是:http://valgrind.org

  你可以在它的网站上下载到最新的valgrind,它是开放源码和免费的.

  一、介绍

  valgrind包含几个标准的工具,它们是:

  1、memcheck

  memcheck探测程序中内存管理存在的问题.它检查所有对内存的读/写操作,并截取所有的malloc/new/free/delete调用.因此memcheck工具能够探测到以下问题:

  1)使用未初始化的内存

  2)读/写已经被释放的内存

  3)读/写内存越界

  4)读/写不恰当的内存栈空间

  5)内存泄漏

  6)使用malloc/new/new[]和free/delete/delete[]不匹配.

  2、cachegrind

  cachegrind是一个cache剖析器.它模拟执行CPU中的L1, D1和L2 cache,因此它能很精确的指出代码中的cache未命中.如果你需要,它可以打印出cache未命中的次数,内存引用和发生cache未命中的每一行代码,每一个函数,每一个模块和整个程序的摘要.如果你要求更细致的信息,它可以打印出每一行机器码的未命中次数.在x86和amd64上,cachegrind通过CPUID自动探测机器的cache配置,在多数情况下它不再需要更多的配置信息了.

  3、helgrind

  helgrind查找多线程程序中的竞争数据.helgrind查找内存地址,那些被多于一条线程访问的内存地址,但是没有使用一致的锁就会被查出.这表示这些地址在多线程间访问的时候没有进行同步,很可能会引起很难查找的时序问题.

  二、valgrind对你的程序都做了些什么 拥有帝国一切,皆有可能。欢迎访问phome.net

  valgrind被设计成非侵入式的,它直接工作于可执行文件上,因此在检查前不需要重新编译、连接和修改你的程序.要检查一个程序很简单,只需要执行下面的命令就可以了

  valgrind --tool=tool_name program_name

  比如我们要对ls -l命令做内存检查,只需要执行下面的命令就可以了

  valgrind --tool=memcheck ls -l

  不管是使用哪个工具,valgrind在开始之前总会先取得对你的程序的控制权,从可执行关联库里读取调试信息.然后在valgrind核心提供的虚拟CPU上运行程序,valgrind会根据选择的工具来处理代码,该工具会向代码中加入检测代码,并把这些代码作为最终代码返回给valgrind核心,valgrind核心运行这些代码.

  如果要检查内存泄漏,只需要增加--leak-check=yes就可以了,命令如下

  valgrind --tool=memcheck --leak-check=yes ls -l

  不同工具间加入的代码变化非常的大.在每个作用域的末尾,memcheck加入代码检查每一片内存的访问和进行值计算,代码大小至少增加12倍,运行速度要比平时慢25到50倍.

  valgrind模拟程序中的每一条指令执行,因此,检查工具和剖析工具不仅仅是对你的应用程序,还有对共享库,GNU C库,X的客户端库都起作用.

  三、现在开始

  ,在编译程序的时候打开调试模式(gcc编译器的-g选项).如果没有调试信息,即使最好的valgrind工具也将中能够猜测特定的代码是属于哪一个函数.打开调试选项进行编译后再用valgrind检查,valgrind将会给你的个详细的报告,比如哪一行代码出现了内存泄漏.

  当检查的是C 程序的时候,还应该考虑另一个选项 -fno-inline.它函数调用

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号