文档章节

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

t
 tMemMonitor
发布于 2015/10/21 16:41
字数 1922
阅读 1314
收藏 0
点赞 1
评论 3

         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  



© 著作权归作者所有

共有 人打赏支持
t
粉丝 0
博文 4
码字总数 1922
作品 0
崇明
加载中

评论(3)

t
tMemMonitor

引用来自“沧浪淼客”的评论

稍微改进下更好用啊
1.文件拖拽
2.双击列表文件启动
3.控制台程序抓不到,MFC没抓到但是data目录生成了*.log.js,为啥是js文件呢???
嗯,谢谢您的宝贵建议~ 目前更新了新版本,第二点已经实现了。 第三点中,控制台程序是可以抓的,只是控制台程序不能太简单,得加载user32.dll才行,因为我们是通过user32.dll方式注入的。MFC也是能抓到的,*.log.js文件是结果排序前生成的临时文件,在排序对话框中勾选完排序方式后,*.log.js文件会被处理生成*.log文件,鉴于您的反馈,您可能是在抓取MFC时,程序运行完就关闭tMemMonitor了,所以*.log.js文件没有处理完毕,您可以在程序运行完弹出排序选择对话框(得过一段时间,取决于泄漏大小)后,再关闭tMemMonitor。
沧浪淼客
沧浪淼客
稍微改进下更好用啊
1.文件拖拽
2.双击列表文件启动
3.控制台程序抓不到,MFC没抓到但是data目录生成了*.log.js,为啥是js文件呢???
C
CstudyC
操作比VLD简单
JAVA应用CPU占用100%|内存泄漏分析总结

问题现象 vrs后台系统从某一时间点,根据已查结果,追溯到几个月前上线的PGC审核功能引起。 近期大概一周左右运营使用时会反馈系统访问越来越来慢,最终系统崩溃,无法访问。因为之前媒资每周...

大卫1228 ⋅ 2016/12/27 ⋅ 1

内存调试技巧

引言 C 和 C++ 程序中的内存错误非常有害:它们很常见,并且可能导致严重的后果。来自计算机应急响应小组(请参见参考资料)和供应商的许多最严重的安全公告都是由简单的内存错误造成的。自从...

zhangyujsj ⋅ 2014/04/11 ⋅ 0

软件测试知识大全

一、软件测试基础篇 软件质量测试基础介绍 ● 软件质量与软件测试 ○ 仅依靠软件测试不能保证软件质量 ○ 进行全面质量管理 ● 软件开发与软件测试 ○ 具备UML或编程可以做更多层面的测试,如...

crossmix ⋅ 2015/04/07 ⋅ 0

用了WifiManager这么多年,今天才知道彻底用错了

用了WifiManager这么多年,今天才知道彻底用错了 snowdream - Impossible is nothing!2017-11-141 阅读 android 作者:snowdream Email:yanghui1986527#gmail.com Github: https://github.c......

snowdream - Impossible is nothing! ⋅ 2017/11/14 ⋅ 0

Android内存泄露案例分析

一款优秀的Android应用,不仅要有完善的功能,也要有良好的体验,而性能是影响体验的一个重要因素。内存泄露是Android开发中常见的性能问题。这篇文章,通过我们曾经遇到的一个真实的案例,来...

SuShine ⋅ 2015/09/09 ⋅ 0

性能优化——内存泄漏(2)工具分析篇

内存泄漏系列文章: 性能优化——内存泄漏(1)入门篇 性能优化——内存泄漏(2)工具分析篇 性能优化——内存泄漏(3)代码分析篇 一、简述 在上一篇《性能优化——内存泄漏(1)入门篇》中...

CSDN_LQR ⋅ 2017/06/30 ⋅ 0

JAVA内存的“防水补漏”解决方案

Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用...

loki_lan ⋅ 2013/04/09 ⋅ 6

Android应用内存泄漏的定位、分析与解决策略

Hello,大家好,我是Clock。翻了一下简书,发现有一个多月没有更新博客,本来今天打算和妹纸去电影院看《你的名字》,然后再去到处浪的。 结果因为妹纸公司临时有事,她不得不回公司一趟......

D_clock爱吃葱花 ⋅ 2016/12/04 ⋅ 0

如何在您的Java应用中查找并修复内存泄漏

https://www.tuicool.com/articles/JZvQ73y 【51CTO.com快译】您是否碰到过某个Java应用程序起初运行良好,经过一段时间后却缓慢下来了?或者它在处理少量文件时性能不错,文件量一旦增加就性...

u011001084 ⋅ 2017/12/22 ⋅ 0

Android内存优化(二):一分钟发现内存泄漏

在上一篇文章Android内存优化(一):Java内存区域中已经大体上介绍了Java中的内存分布情况,这一篇主要讲一下内存泄漏的产生原因、内存泄漏的危害、内存泄漏一键分析与定位、以及代码中常见...

C6C ⋅ 2017/03/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法之SlopOne

一、 算法原理 有别于基于用户的协同过滤和基于item的协同过滤,SlopeOne采用简单的线性模型估计用户对item的评分。如下图,估计UserB对ItemJ的偏好 图(1) 在真实情况下,该方法有如下几个...

xiaomin0322 ⋅ 4分钟前 ⋅ 0

LVM讲解

LVM是什么 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地...

李超小牛子 ⋅ 14分钟前 ⋅ 0

mysql更改密码、连接mysql、mysql常用命令

1. 更改mysql的root账户密码: mysql中root账户和系统root不是一个账户 1.1 更改环境变量PATH,增加mysql绝对路径 由于mysql安装目录为/usr/local/mysql/,所以系统不能直接使用mysql,需把/...

laoba ⋅ 15分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

猫耳m ⋅ 15分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云云栖社区 ⋅ 18分钟前 ⋅ 0

1.03-Maven中使用ueditor富文本编辑器

起因:在maven仓库未找到百度的ueditor的jar包 操作: 1.下载百度的ueditor的jar包 2.打开命令行,切换到ueditor的下载位置,运行一下命令: mvn install:install-file -Dfile=ueditor-1.1....

静以修身2025 ⋅ 24分钟前 ⋅ 0

几道Spring 面试题

1、BeanFactory 接口和 ApplicationContext 接口有什么区别? ApplicationContext 接口继承BeanFactory接口 Spring核心工厂是BeanFactory BeanFactory采取延迟加载,第一次getBean时才会初始...

职业搬砖20年 ⋅ 33分钟前 ⋅ 0

包饺子

http://storage.slide.news.sina.com.cn/slidenews/77_ori/2018_24/74766_826131_625489.gif

霜叶情 ⋅ 35分钟前 ⋅ 0

xml解析

方法一: String s_xml1 = "<xml>" + "<head>lalalalal</head>" + "<body>1234</body>" + "</xml>"; try { DocumentBuilderFactory documentBuilderFactory......

GithubXD ⋅ 47分钟前 ⋅ 0

reuse stream

Although Java streams were designed to be operated only once, programmers still ask how to reuse a stream. From a simple web search, we can find many posts with this same issue ......

idoz ⋅ 47分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部