编程是碰到最麻烦的问题恐怕就是内存泄露了,内存泄露问题往往不易发现,特别是在内存泄露的大小很小的情况下,如果不是程序长时间运行,恐怕很难发现,而调试内存泄露的问题也常常显得相当困难,最传统的办法恐怕就是一行行地去检查代码了,而对于工程项目,往往涉及到很多人的工作,而且代码量也是相当可观的,要检查内存泄露问题,靠一行行地读代码恐怕是相当头疼的事情(虽然本人也做个这种傻事,囧...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 (安装和命令说明)