腾讯WeTest测试技术分享

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

2016-05-23  本文已影响407人  bingyanshi

本文转载自:腾讯WeTest专栏--《【腾讯内部工具】内存泄漏分析工具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则采用全透明的包裹函数,将挂钩函数分为前后二部分(如图1所示)。在函数调用前执行

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

上一篇下一篇

猜你喜欢

热点阅读