内存泄漏分析工具tMemMonitor (TMM)使用简介
内存泄漏分析工具tMemMonitor (TMM)使用简介
C/C++由于灵活、高效的优点一直以来都是主流的程序设计语言之一,但是其内存的分配与释放均由程序员自己管理,当由于疏忽或错误造成程序未能释放不再使用的内存时就会造成内存泄漏。在大型、复杂的应用程序中,内存泄漏往往是最常见的问题,因而及时解决内存泄漏非常必要。tMemMonitor (TMM)作为一个专业、准确、易用的内存泄漏分析工具,可以帮助C/C++程序员迅速地解决内存泄漏这个令人头疼的问题。
TMM下载地址(中文版): http://download.csdn.net/detail/tmemmonitor/9444634
TMM下载地址(英文版): http://download.csdn.net/detail/tmemmonitor/9444660
一.背景
目前市面上已有一些Windows平台下的内存泄漏动态检测工具,比如UMDH,VLD,Purify,BoundsCheck等,其中Purify和BoundsCheck是昂贵的商用软件,UMDH需要人工获取内存快照,操作门槛较高,VLD则需要修改源程序的代码,同时这几款工具都存在误报情况,因此准确性不高。针对Windows平台,C/C++程序员迫切需要一款专业、准确、易用的内存泄漏分析工具。
二.TMM简介
TMM是一款运行时C/C++内存泄漏检测工具。TMM认为在进程退出时,堆内存中没有被释放且没有指针指向的无主内存块即为内存泄漏,并进而引入垃圾回收(GC, Garbage Collection)机制,在进程退出时检测出堆内存中所有没有被引用的内存单元,因而内存泄露检测准确率为100%。
TMM工具主要包含两部分,第一部分是客户端的检测界面,客户端部分主要负责监控目标进程中的内存行为并计算内存泄漏。检测时只要将被检测程序添加到监控列表中,然后正常运行被检程序即可,以下为客户端界面:
另一部分是结果的展示与分析。TMM支持本地查看和在线查询两种方式。本地查看时,提供按泄漏次数或泄漏大小对结果进行排序的功能,并在安装目录的data文件夹中给出详细分析报告。用户也可凭QQ帐号登录WeTest网站对内存泄漏情况进行在线查询。以下为本地查看结果:
三.TMM的特性和优点
专业
Ø 最快的注入技术
Ø 基于GC的精准算法,无需内存快照
Ø 无损目标程序性能
Ø 检测结果精准定位到代码堆栈信息
准确
Ø 二次遍历堆内存对象里的指针
Ø 寄存器级的问题跟踪,完整扫描每个线程里32位寄存器内的指针
Ø 不放过全局数据区里的内容
易用
Ø 支持自定义程序
Ø 无须编译,立即使用
Ø 一键操作,无需切换
四.算法原理
1. 替换/注入堆内存分配函数的算法
Windows中有多种级别的内存分配函数,其中,最底层的是ntdll.dll提供的Rtl系列函数,在这之上的有Windows API提供的heap管理函数,再上层,C/C++库提供了malloc/free函数和new/delete操作符,因此替换如此层级复杂的函数比较困难,同时如果替换现有的堆分配函数,则无法做到和原有函数的执行效果完全一致,所以替换原生的堆分配函数对于Windows系统来说几乎是不可行的,那么只能wrap(包裹)这些堆分配函数。
Linux下的内存检测工具,比如Valgrind就采用了包裹堆分配函数的方法,但它包裹的方法是不透明的,在调用栈中会多出额外一帧。TMM则采用全透明的包裹函数,将挂钩函数分为前后二部分(如图1所示)。在函数调用前执行per-hook函数,在函数返回前调用执行post-hook函数。有了前后挂钩函数,TMM就可以在堆分配/释放函数执行前获得参数,并修改分配大小之类的参数;在函数执行后,记录分配的大小和地址、调用栈之类的信息。
图1
2. 泄露检测的算法
TMM使用基于堆内存可访问性的内存泄露检测法( reachability-based leak detection),该算法的核心就是检测(扫描)没有任何指针指向的堆内存,具体分为五步:
Step 1. 进程退出时,suspend所有线程,防止数据在扫描过程中更改。假设此时进程中的堆内存布局如图2所示;
图2
Step 2. 统计root-set,它由每个线程的寄存器、所有非堆内存、所有线程栈帧顶部RSP/ESP以上区域、所有库的数据区组成;
Step 3. 从root-set出发遍历图2,标记出有指针指向的内存块,即beginning reachable blocks,如图3中A、C;
图3
Step 4. 由于beginning reachable blocks也会包含有指针,因此通过遍历beginning reachable blocks可以找出其内部指针指向的内存块并标记,如图4中B;
图4
Step 5. 统计检测出来的内存泄漏,即图4中unreachable的堆内存块D、E、F。
五.使用步骤
图5
1. 在拥有Administrator权限的情况下启动TMM。
2. 在监控列表中右键添加目标程序,正常操作。
3. 正常退出目标程序。
4. 耐心等待检测结果生成(目标程序状态由running变为null时,说明程序正常退出,检测结果生成完毕)。
5. 查看结果。
六.注意事项
1. 安装TMM时,用户应具有Administrator权限,并且TMM不支持中文安装路径。
2. 使用TMM时需要修改注册表,如遇安全软件弹窗警告,可将TMM加入信任列表放心使用。
3. 被检测程序不能是加壳版本,因为加壳程序的函数名和函数地址已经混淆。
4. 被检测程序需是release版本。
5. 如需在分析报告中显示泄漏点详细堆栈信息,请在被检测程序同级目录放置同版本的PDB文件,PDB解析时目录不支持中文。
6. 使用TMM导致被测程序退出时变慢属于正常情况,此时TMM正在统计内存泄漏情况,请不要手动强制结束进程。
七.总结
TMM适用于PC端所有C/C++程序的内存泄漏分析。对于被测程序,不需要修改源代码,运行一次被测程序就能够准确定位泄漏的文件名和行号。TMM是一款专业、准确、易用的内存泄漏检测工具,值得每个程序员拥有。
TMM下载地址(中文版): http://download.csdn.net/detail/tmemmonitor/9444634
TMM下载地址(英文版): http://download.csdn.net/detail/tmemmonitor/9444660
内存泄漏分析工具tMemMonitor (TMM)使用简介相关推荐
- tMemMonitor (TMM) ----- 100%正确的内存泄漏分析工具
C/C++由于灵活.高效的优点一直以来都是主流的程序设计语言之一,但是其内存的分配与释放均由程序员自己管理,当由于疏忽或错误造成程序未能释放不再使用的内存时就会造成内存泄漏.在大型.复杂的应用程序中, ...
- android分析内存工具,Android Studio内存泄漏分析工具汇总
Android Studio内存泄漏分析工具汇总 时间:2017-04-25 来源:Android开发学习网 在Android开发过程中,让人头疼的就是内存泄露问题了,很小的一个错误都会引起内 ...
- new arraylist内存_Java内存泄漏分析工具Memory Analyzer Tool
阅读文本大概需要3分钟. 一个大型的Java项目也许从开发到测试结束并可能不能未发现一些重大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏直接导致服务宕机,遇到这样的问题对于一个经验 ...
- eclipse占用内存过大_Java内存泄漏分析工具Memory Analyzer Tool
一个大型的Java项目也许从开发到测试结束并可能不能未发现一些重大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏直接导致服务宕机,遇到这样的问题对于一个经验尚浅的开发人员来说难度非常 ...
- android 内存泄漏分析工具,Android内存泄漏终极解决篇(上)
一.概述 在Android的开发中,经常听到"内存泄漏"这个词."内存泄漏"就是一个对象已经不需要再使用了,但是因为其它的对象持有该对象的引用,导致它的内存不能 ...
- java分析内存泄露工具_Eclipse Memory Analyzer(Java内存泄漏分析工具)
概述 一个大型的Java项目也许从开发到测试结束并未发现一些大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏,遇到这样的问题对于一个经验尚浅的开发人员来说难度非常大,好的一点是JVM ...
- chrome内存泄露(一)、内存泄漏分析工具
内存分析使用的工具包括chrome任务管理器.chrome时间轴(低版本是Timeline,高版本对应performance).chrome memory(低版本是chrome profiles,主要 ...
- python 内存泄漏分析工具_记一次调试python内存泄露的问题
这两天由于公司需要, 自己编写了一个用于接收dicom文件(医学图像文件)的server. 经过各种coding-debuging-coding-debuging之后, 终于上线了, 上线后心里美滋滋 ...
- android释放acitity内存,Android 内存泄漏分析与解决方法
在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...
最新文章
- python购物车程序2019_Python实现购物车程序
- linux简单搭建ftp服务器
- Yoshua Bengio等图神经网络的新基准Benchmarking Graph Neural Networks(代码已开源)
- Natasha 4.0 探索之路系列(三) 基本的动态编译
- numpy 平方_NumPy入门指南
- 一步步手动实现热修复(二)-类的加载机制简要介绍
- c# picturebox控件显示本地图片和显示网上的图片
- Eclipse启动SpringCloud微服务集群的方法
- “租房帮”产品体验报告
- 设计模式PHP篇(三)————适配器模式
- Windows 8部署系列PART7:配置MDT部署目标
- 一套很好的51单片机教程,云龙51单片机视频教程(王云)
- [实践篇]13.9 如何使用gcore(ramdump)排查内存黑洞?
- 高三数学微课堂【教学视频】
- 微信小程序快速达到1000UV流量主开通标准
- 性能优化,进无止境---CPU篇
- ArcGIS中相对高程的提取
- fixed income
- 关于互联网公司,说几句个人感触
- 51单片机与AVR(SPI)单片机驱动DS1302