内存泄漏分析工具tMemMonitor (TMM)使用简介

C/C++由于灵活、高效的优点一直以来都是主流的程序设计语言之一,但是其内存的分配与释放均由程序员自己管理,当由于疏忽或错误造成程序未能释放不再使用的内存时就会造成内存泄漏。在大型、复杂的应用程序中,内存泄漏往往是最常见的问题,因而及时解决内存泄漏非常必要。tMemMonitor (TMM)作为一个专业、准确、易用的内存泄漏分析工具,可以帮助C/C++程序员迅速地解决内存泄漏这个令人头疼的问题。

TMM下载地址:http://download.csdn.net/download/tmemmonitor/9135585

 

一.背景

目前市面上已有一些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/download/tmemmonitor/9135585

QQ支持:        2304186838

联系Email:    [email protected]

时间: 2024-10-11 05:25:39

内存泄漏分析工具tMemMonitor (TMM)使用简介的相关文章

100%正确的内存泄漏分析工具       --------tMemMonitor (TMM)

C/C++由于灵活.高效的优点一直以来都是主流的程序设计语言之一,但是其内存的分配与释放均由程序员自己管理,当由于疏忽或错误造成程序未能释放不再使用的内存时就会造成内存泄漏.在大型.复杂的应用程序中,内存泄漏往往是最常见的问题,因而及时解决内存泄漏非常必要.tMemMonitor (TMM)作为一个专业.准确.易用的内存泄漏分析工具,可以帮助C/C++程序员迅速地解决内存泄漏这个令人头疼的问题. TMM下载地址: 一.开发背景 目前市面上已有一些Windows平台下的内存泄漏动态检测工具,比如U

Android内存泄漏分析实战

内存泄漏简单介绍 java能够保证当没有引用指向对象的时候,对象会被垃圾回收器回收.与c语言自己申请的内存自己释放相比,java程序猿轻松了非常多.可是并不代表java程序猿不用操心内存泄漏.当java程序发生内存泄漏的时候往往具有隐蔽性.因此要借助一些专业的平台资源去保证安全性,比如能够通过加密实现. 定义 引用百度百科的定义:"用动态存储分配函数动态开辟的空间,在使用完成后未释放,结果导致一直占领该内存单元. 直到程序结束".从程序员的角度来看"内存泄漏",事实

android 内存泄漏分析技巧

java虚拟机运行一般都有一个内存界限,超过这个界限,就会报outofmemory.这个时候一般都是存在内存泄漏.解决内存泄漏问题,窃以为分为两个步骤:分析应用程序是否真的有内存泄漏,找到内存泄漏的地方.这两个步骤都不是一般意义上的调试,直接打log,断点调试都不是太给力.动脑筋想一想,内存问题应该在很多地方上都会出现,这么常见的问题应该是有工具的.android现在更可以说是一个生态系统,当然也有很多开发辅助工具.在前面的两个步骤中都有很强大的武器,熟练的掌握这些利器,分析问题就会事半功倍.

使用Eclipse Memory Analyzer进行内存泄漏分析三部曲

源地址:http://seanhe.iteye.com/blog/898277 一.准备工作 分析较大的dump文件(根据我自己的经验2G以上的dump文件就需要使用以下介绍的方法,不然mat会出现oom)需要调整虚拟机参数 找个64位的系统在MemoryAnalyzer.ini设置-Xmx2g 如果是32位的xp可以使用下面的方法进行尝试: 安装jrockit 6.0的JDK mat使用jrockit的jdk来启动 Java代码   -vm D:/Program Files/Java/jroc

Java内存泄漏分析与解决方案

Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历与各位网友分享解决这些问题的办法. 作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端.服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存和CPU资源消耗急剧增加,持续增长到出现java.lang.Ou

Node.js内存泄漏分析

在极客教育出版了一个视频是关于<Node.js 内存泄漏分析>,本文章主要是从内容上介绍如何来处理Node.js内存异常问题.如果希望学习可前往极客学院: 本文章的关键词 - 内存泄漏 - 内存泄漏检测 - GC分析 - memwatch 文章概要 由于内存泄漏在Node.js中非常的常见,可能在浏览器中应用javascript时,对于其内存泄漏不是特别敏感,但作为服务器语言运行时,你就不得不去考虑这些问题.由于很小的逻辑可能导致服务器运行一天或者一个星期甚至一个月才会让你发现内存不断上涨,而

Unix下C程序内存泄漏检测工具Valgrind安装与使用

Unix下C程序内存泄漏检测工具Valgrind安装与使用 Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O'Reilly开源代码奖. Valgrind遵守GNU通用公共许可证条款,是一款自由软件. 官网 http://www.valgrind.org 下载与安装 #wget http://www.valgrind.org/downlo

Android内存泄漏分析及调试

尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先了解一下dalvik的Garbage Collection: 如上图所示,GC会选择一些它了解还存活的对象作为内存遍历的根节点(GC Roots),比方说thread stack中的变量,JNI中的全局变量,zygote中的对象(class loader加载)等,然后开始对heap进行遍历.到最后,

C++内存泄漏检测工具

C++内存泄漏检测工具 1.VC自带的CRT:_CrtCheckMemory   调试器和 CRT 调试堆函数 1.1用法: /************************************************************************ * 环境:VC6.0 * 程序功能:CRT 检测内存泄漏 * 创建: 2014/3/20 * 版本号:1.0 **********************************************************