Bootstrap

【腾讯内部工具分享】内存泄漏分析工具tMemoryMonitor

  本文由腾讯WeTest团队提供,更多资讯可直接戳链接查看:http://wetest.qq.com/lab/
  微信号:TencentWeTest

【腾讯内部工具分享】内存泄漏分析工具tMemoryMonitor

【引言】 
今天给大家介绍一款腾讯自主研发,荣获2015年十佳组件第一名的“tMemoryMonitor”内存泄漏分析工具。该腾讯内部工具已经在腾讯WeTest官网内开放给用户使用,助您在工作中扫除内存泄露问题,让工作精益求精。 
链接:[wetest.qq.com] 
图片描述
工具使用入口

【工具简介】 
tMemoryMonitor简称TMM,是一款运行时C/C++内存泄漏检测工具。TMM认为在进程退出时,内存中没有被释放且没有指针指向的无主内存块即为内存泄漏,并进而引入垃圾回收机制,在进程退出时检测出堆内存中所有没有被引用的内存单元,因而内存泄漏检测准确率为100%。TMM下载地址:http://wetest.qq.com/cloud/index.php/index/TMM 
【开发目的】 
防泄漏测试一直是编程测试中非常重要的一个模块,尽管目前市面上已有一些Windows平台下的内存泄漏动态检测工具,比如UMDH,VLD,Purify,BoundsCheck等,但其中Purify和BoundsCheck是昂贵的商用软件,UMDH需要人工获取内存快照,操作门槛较高,VLD则需要修改源程序的代码,同时这几款工具都存在误报情况,因此准确性不高。而我们的tMemMonitor就是一款针对Windows平台专业、准确、易用的内存泄漏分析工具。 
图片描述
目前正使用TMM的腾讯团队

【算法原理】 
Windows 中有多种级别的内存分配函数,其中,最底层的是ntdll.dll 提供的Rtl 系列函数,在这之上的有Windows API 提供的heap 管理函数,再上层,C/C++库提供了malloc/free 函数和new/delete 操作符,因此替换如此层级复杂的函数比较困难,同时如果替换现有的堆分配函数,则无法做到和原有函数的执行效果完全一致,所以替换原生的堆分配函数对于Windows 系统来说几乎是不可行的,那么只能wrap(包裹)这些堆分配函数。 
Linux 下的内存检测工具,比如Valgrind 就采用了包裹堆分配函数的方法,但它包裹的方法是不透明的,在调用栈中会多出额外一帧。TMM 则采用全透明的包裹函数,将挂钩函数分为前后二部分(如图)。 
图片描述
在函数调用前执行per-hook 函数,在函数返回前调用执行post-hook 函数。有了前后挂钩函数,TMM就可以在堆分配/释放函数执行前获得参数,并修改分配大小之类的参数;在函数执行后,记录分配的大小和地址、调用栈之类的信息

【案例介绍】 
下面我们通过测试市面上一款我们常用的音乐软件,来看看这款软件能给我们带来怎样的收益。 
在拥有Administrator权限的情况下启动TMM,然后在列表区添加XX音乐这款软件,就已经成功在TMM中加载了这款程序。 
1.我们在XX音乐中随意选择一首歌进行播放 
2.播放结束后正常退出XX音乐,这时TMM就会弹出一个名为“data”文件夹,里面包括着在播放音乐期间的数据泄漏详情 
3.点开文档后就能详细查看文件泄漏的具体报告 

日志所在文件夹


报告内容


泄露情况报告

【注意事项】 
1.安装TMM时,用户应有Administrator权限,并且TMM不支持中文安装途径。 
2.使用TMM时需要修改注册表,如遇安全软件弹窗警告,可将TMM加入信任列表放心使用 
3.被检测程序不能是加壳版本,因为加壳程序的函数名和函数地址已经混淆 
4.被检测程序需是release版本 
5.如需在分析报告中显示泄漏点详细堆栈信息,请在被检测程序同级目录放置同版本的PDB文件,PDB解析时目录不支持中文 
6.使用TMM导致被测程序退出时变慢属于正常情况,此时TMM正在统计内存泄漏情况,请不要手动强制结束进程。

【总结】 
TMM 适用于PC 端所有C/C++程序的内存泄漏分析。对于被测程序,不需要修改源代码,运行一次被测程序就能够准确定位泄漏的文件名和行号。TMM 是一款专业、准确、易用的内存泄漏检测工具,值得每个程序员拥有。

TMM下载地址:http://wetest.qq.com/cloud/index.php/index/TMM


  本文由腾讯WeTest团队提供,更多资讯可直接戳链接查看:http://wetest.qq.com/lab/
  微信号:TencentWeTest

;