linux 下 定位内存泄漏 valgrind

      排查项目中遇到的内存泄露问题,用到valgrind工具,记录下具体的用法以及注意事项,以备后用。

首先要明确的是valgrind 是可靠的:刚开始使用valgrind测试出一些内存泄漏点,通过代码发现及日志跟

踪,发现流程上“没有问题”,一度怀疑valgrind 是不是报告假消息。后来所有报出来的泄漏点均证实确实

存在泄露。 下面介绍下valgrind基本使用方法:

      如果系统没有安装valgrind,首先得安装下,我们测试的系统是Ubuntu16.04,直接 sudo apt-get install 

valgrind  在命令行如下命令:

root@Ubuntu16:~# valgrind --tool=memcheck --leak-check=full  --show-reachable=yes --log-file=./mem.txt ./CGServer

 

      程序运行一段程序后结束程序运行,查看生成的文件(上面的命令指定了日志文件名为mem.txt),示例日志

文件内容 如下图所示:

                 

                                                                    图1. 示例日志内容

 

        需要注意的是提示still reachable的地方 也有可能是泄露点。still reachable 原意是仍然可以被释放,如果是

库初始化处提示still reachable 没有问题,因为只有程序不退出,不能被释放。如果被反复调用的接口处也提示

still reachable 基本上都属于内存泄露,需要解决。

     另外调用malloc分配的内存 free后内存不一定会立即交还操作系统,glibc有自己的内存管理机制。默认分配超

过128K的内存,free后会内存会立即交还操作系统(这个阈值可通过mallopt接口设置M_MMAP_THRESHOLD进

行修改)。小于128K先缓存起来,适当的时候释放。如果希望尽快释放内存可执行mall_trim(0)(可单独开启一个线

程定时执行该方法,该方法可释放本进程内其他线程free后的内存(交还操作系统))。 相比之下Windows系统下

内存释放没有这个问题调用free接口后一定是及时释放内存的。

     linux下 查看程序占用的内存可通过 top -p 进程Pid  命令进行查看,整体上该命令输出的进程内存信息是准确的,

通过该命令查看进程内存如果进程占用内存一直增加 一定是有问题的。

   

如需交流可加QQ群766718184,1038388075 或者QQ3501870,

视频下载地址:http://www.chungen90.com/?list_53

 Demo下载地址: http://www.chungen90.com/?list_52

 

posted @ 2020-10-23 14:09  王纲  阅读(1339)  评论(0编辑  收藏  举报