C++ 程序内存泄漏检测方法
一、前言
在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准。而在Windows平台,服务器和客户端开发人员惯用的调试方法有很大不同。下面结合我的实际经验,整理下常见定位内存泄漏的方法。
注意:我们的分析前提是Release版本,因为在Debug环境下,通过VLD这个库或者CRT库本身的内存泄漏检测函数能够分析出内存泄漏,相对而言比较简单。而服务器有很多问题需要在线上并发压力情况下才出现,因此讨论Debug版调试方法意义不大。
二、对象计数
方法:在对象构造时计数++,析构时–,每隔一段时间打印对象的数量
优点:没有性能开销,几乎不占用额外内存。定位结果精确。
缺点:侵入式方法,需修改现有代码,而且对于第三方库、STL容器、脚本泄漏等因无法修改代码而无法定位。
三、重载 new 和 delete
方法:重载new/delete,记录分配点(甚至是调用堆栈),定期打印。
优点:没有看出
缺点:侵入式方法,需将头文件加入到大量源文件的头部,以确保重载的宏能够覆盖所有的new/delete。记录分配点需要加锁(如果你的程序是多线程),而且记录分配要占用大量内存(也是占用的程序内存)。
四、Hook Windows 系统 API
方法:使用微软的detours库,hook分配内存的系统Api:HeapAlloc/HeapRealloc/HeapFree(new/malloc的底层调用),记录分配点,定期打印。
优点:非侵入式方法,无需修改现有文件(hook api后,分配和释放走到自己的钩子函数中),检查全面,对第三方库、脚本库等等都能统计到。
缺点:记录内存需要占用大量内存,而且多线程环境需要加锁。
五、使用 DiagLeak 检测
微软出品的内存泄漏分析工具,原理同hookapi方式。配合LDGraph可视化展示内存分配数据,更方便查找泄漏。
1.在IDE工程选项里面配置Release版本也生成调试信息,发布时,将pdb文件和exe文件一起发布。
2.程序运行后,打开LeakDiag,设置Symbol path
3.定期Log下目标进程的内存分配情况,通过LDGraph打印分配增长情况,来发现内存泄漏。
优点:同hookapi方法,非侵入式修改,无需做任何代码改动。跟踪全面。可视化分析堆栈一览无余!
缺点:对性能有影响,hook分配加锁,遍历堆栈。但是不会占用目标进程的自身内存。
六、总结
对于线上生产环境,建议大对象用计数来判断,定位快速准确,几乎无性能开销。在对外测试阶段,使用LeakDiag辅助分析,因为此时并发压力还不是太大,性能开销还是可以承受。在线上大规模应用阶段,通过HookApi的方法,结合GM指令控制部分时间段的检测,这样可以把对玩家的影响(服务器性能下降导致延迟)降到最低。
C++ 程序内存泄漏检测方法相关推荐
- Visual Studio 内存泄漏检测方法
Visual Studio 内存泄漏检测方法 非MFC程序可以用以下方法检测内存泄露: 1.程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK ne ...
- Linux内存泄漏检测方法总结
Linux内存泄漏检测方法总结 一.mtrace分析内存泄露 mtrace原理 设置日志生成路径 测试实例 日志 泄露分析 使用addr2line工具定位源码位置 使用mtrace工具分析日志信息 二 ...
- 简单内存泄漏检测方法,解决Detected memory leaks!问题 .
工作环境:WIN7,VS2005: 最近一个项目中,程序退出后,每次都出现内存泄漏,每次退出的时候泄露的内存块都是1654,1650. Detected memory leaks! Dumping o ...
- c语言内存泄漏怎么测试,C语言内存泄漏检测方法
内存泄漏是C语言编程中一个很常见的问题,而且由于内存泄漏所导致的问题出现较缓慢,所以不容易觉察,所以写一个简单的程序来检测内存泄漏很有必要. 内存泄漏通常是指堆内存的泄漏,也就是通过malloc.ca ...
- Unix下C程序内存泄漏检测工具Valgrind安装与使用
Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...
- 基于Android Studio的Android内存泄漏检测方法
自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclip ...
- iOS 内存泄漏排查方法及原因分析
级别: ★★☆☆☆ 标签:「iOS」「内存泄漏排查」「Leaks工具」 作者: MrLiuQ 审校: QiShare团队 本文将从以下两个层面解决iOS内存泄漏问题: 内存泄漏排查方法(工具) 内存泄 ...
- android内存检测方法,Android_Android系统检测程序内存占用各种方法,1.检查系统总内存
复制代码 - phpStudy...
Android系统检测程序内存占用各种方法 1.检查系统总内存 liuhx@uc ~ $ adb shell cat /proc/meminfo MemTotal: 840868 kB ...
- OpenCV中的内存泄漏检测
转自:http://chaishushan.blog.163.com/blog/static/130192897200911685559809/ 内存泄漏时程序开发中经常遇到的问题. 而且出现内存泄漏 ...
最新文章
- 如何将深度学习研究论文实现为代码的几个要点
- Groovy简介和一点资源
- 玄学········为什么在eclipse上更改程序之后运行之后好像没更改一样
- CentOS 7 安装SVN服务端
- 转载系列之一:浅析Hadoop文件格式
- 数百万的 Android 手机预装了危险的恶意软件!
- 工程师,你的钱究竟从哪来?
- jQuery file upload测试
- 将字符串转换为数组_LeetCode108-将有序数组转换为二叉搜索树
- 遇见C++ Lambda
- 现代通信原理:月考(二)答案
- 标学历年真题2016年版 真考题库1 电子表格
- cad工具快速选择特性里面是空的解决方法
- 基础IT技术学习资料300篇,欢迎一键收藏
- 微信小程序,电商又一春!
- Centos7——将网卡修改为任意名称
- 和ASP.NET AJAX应用程序环游地球
- 【计算机组成原理】Cache缓存:高速缓冲存储器
- iOS 蓝牙 Corebluetooth
- Python中的sort()使用方法
热门文章
- myEclipse开发内存溢出解决办法myEclipse调整jvm内存大小java.lang.OutOfMemoryError: PermGen space及其解决方法...
- MySQL临时表的操作使用
- iOS开发——多线程篇——GCD
- HTML5 Placeholder实现input背景文字提示效果
- CSS连载-控制背景与CSS精灵
- WORD2010自动编号后,目录那里编号和文字中间有很大的空格,怎么
- FLASH脚本语言详解
- 牛客网(剑指offer) 第十七题 树的子结构
- Swaks-smtp瑞士军刀(smtp邮件)
- linux下镜像播放视频,linux下挂载iso镜像的方法