对于C或C++程序员来说,面对的bug很大部分是内存操作问题,这其中比较令人头疼的就是内存泄漏了,虽然我们有valgrind 和AScan等内存问题的检测工具,但是valgrind每次输出一大堆,AScan有时候看输出结果看的是云里雾里的。再说,谁会嫌弃工具箱里面多个工具那。,内存泄漏问题的检查步骤,对于做过c或c++同学都比较熟悉:,首先通过top或vmstat 、或smem(本次介绍)等工具查看内存情况,看看是否出现了内存泄漏。,其次用pidstat 或top指定进程的方式,观察可以进程内存占用情况。,用memleak或gdb工具查看内存泄漏。,先上测试代码:,程序比较简单,编译运行起来:,这次用下新工具smem,这是一个python写的小工具,可以统计系统中所有进程占用的物理内存RSS、以及去掉共享内存的PSS、以及程序本身的独占内存USS的情况。,安装:,常用命令:,-k 带单位显示内存,-u -k 带单位显示每个用户的内存占用:,-w -k 显示系统整体内存情况类似free,-k -s uss -r 按照uss的占用从大到小排序的方式展示内存的占用情况 非常实用,好了基本命令介绍完毕,那我们来看看如何查看内存是否泄漏吧,因为内存泄漏的程序占用的内存是一直再增加的(这不是废话嘛),这样我们就可以用上面的排序命令只观察上面几个进程了。,小技巧,watch加在命令前面,5s执行一次命令,会高亮显示改变的部分。,,在ubuntu下安装memleak竟然很难安装,我用的是最新的服务器版本,后面在centos下安装后测试的:,fibo 函数出现内存泄漏,把泄漏的字节数都打印了出来,我们改了下代码把free的注释去掉,再用memleak查看等了一会还是没有泄漏信息,说明已经修复了,如下:,也许你对memleak已经很熟悉了,那来看看gdb查看函数的内存泄漏方法吧,这个方法只是查看具体的一个函数是否存在内存泄漏,一定的场景下还是蛮实用的。 把代码中的 for (n = 2; n > 0; n++) 改成 for (n = 2; n > 0&& n <10; n++),Total (incl. mmap):即本程序占用的总内存,看到明显的增加部分即为未释放的内存,程序使用的内存增加:8224768 稍大于 256000*4*8 分配的内存,内存分配需要存储链表还有一些对齐原因所以会多分配些。,free之后的场景:,in use bytes 为0了。
© 版权声明
文章版权归作者所有,未经允许请勿转载。