开发者社区> xumaojun> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

内存泄漏分析工具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

 

         QQ支持:        2304186838   

         联系Email:    2304186838@qq.com 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用 Chrome Dev tools 分析应用的内存泄漏问题
使用 Chrome Dev tools 分析应用的内存泄漏问题
104 0
使用 Chrome Dev tools 分析应用的内存泄漏问题
使用 Chrome Dev tools 分析应用的内存泄漏问题
264 0
Python静态类型解析工具简介和实践
Python是一门强类型的动态类型语言,开发者可以给对象动态指定类型,但类型不匹配的操作是不被允许的。动态类型帮助开发者写代码轻松愉快,然而,俗话说:动态一时爽,重构火葬场。动态类型也带来了许多麻烦,如果动态语言能加入静态类型标记的话,会有什么好处呢?本文将主要介绍Python对静态类型的支持、社区发展的现状、类型检查工具介绍与对比,以及类型解析的实战。
3669 0
python简介及环境搭建 | python从入门到精通:入门篇之三
本节将介绍Python的开发环境是如何搭建的,以及Python如何进行安装。
10380 0
基于WinDbg的内存泄漏分析
在前面C++中基于Crt的内存泄漏检测一文中提到的方法已经可以解决我们的大部分内存泄露问题了,但是该方法是有前提的,那就是一定要有源代码,而且还只能是Debug版本调试模式下。实际上很多时候我们的程序会用到第三方没有源代码的模块,有些情况下我们甚至怀疑系统模块有内存泄露,但是有没有证据,我们该怎么办? 这时我们就要依靠无所不能的WinDbg了。
1574 0
【工具】sysbench 0.5 简介
一 前言   因为在准备做压力测试方面的工作,看到sysbench 目前最新的版本是0.5 ,相比之前的0.4的版本,最大的变化是 test 参数的改变,在压测MySQL时,新版本中test将取值为 lua脚本,该种方式给压测工作带来很大的灵活性。
1681 0
Spring 视图和视图解析器简介
什么是 Spring 视图和视图解析器? Spring MVC(Model View Controller)是 Spring 中一个重要的组成部分,而 Spring 视图和视图解析器则是 Spring MVC 中的组成部分。在介绍 Spring 视图和视图解析器前,我们先了解下在 Spring MVC 框架中,一个 Web 请求所需经历的六个阶段: 请求会首先被 Spr
2111 0
Disruptor简介
        Disruptor简介,近期推出!
578 0
protobuf 语法简介
protobuf 语法简介 1.基本语义 在.proto文件中,最基本的数据类型为message,如其定义所示,由message引导,之后是message类型的名字,之后是由{}包含的各个域(fields)。
642 0
+关注
xumaojun
乐于学习与分析
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Arthas应用诊断利器-新特征介绍
立即下载
使用Arthas 抽丝剥茧深入应用-线上诊断利器之外
立即下载
如何做小程序性能优化
立即下载