本文由腾讯 WeTest 团队提供,更多资讯可直接戳链接查看:http://wetest.qq.com/lab/
微信号:TencentWeTest
【引言】
今天给大家介绍一款腾讯自主研发,荣获 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
本文由腾讯 WeTest 团队提供,更多资讯可直接戳链接查看:http://wetest.qq.com/lab/
微信号:TencentWeTest