您的位置:首页 > 产品设计 > UI/UE

可以在工作环境一直运行的内存泄漏检测工具, 有GUI的泄露分析工具, 分析泄露更加容易

2013-01-08 20:38 531 查看
       

MLeak使用说明
 工具下载

该工具通过hook程序的mscrt动态库的malloc函数来监控内存分配。 因此该工具只适用于那些动态链接CRT的程序。为了运行效率不至于太多的损失, 只监控malloc分配的内存,不考虑其他(例如:HeapAlloc,VirtualAlloc,GlobAlloc,或其他资源分配)。

另外, 为了将内存调用栈定位到相应的源代码, 需要在分析内存泄漏时, 有与运行环境一致的可执行文件(exe或dll)以及对应的pdb。

      自己写的c程序。在客户那老有内存泄露,但是在自己的环境却总是重现不了。

      为了抓住泄露的原因,我也到用户现场过几次,挂上了内存泄露检测工具。但是我在现场的时候,问题总是不能重现!还因为挂上了内存泄露检测工具,程序的速度很慢,导致非常影响用户的工作。

      所以我觉得应该有一种内存泄露检查工具,挂上该工具以后不会明显影响用户操作速度。这样就可以让程序一直挂着内存泄露检测工具,只要问题一发生,就可以打印出内存泄露报告。而不用一直去想办法重现问题!

      也试过好几种其他的内存泄露检测工具,都不能达到我的要求。郁闷!

     所以,我就写了该工具

一. 监控已经运行的程序 



 

MLeak程序的主窗口是一个进程列表, 列出了当前计算机上运行着的进程。用户可以点击窗口下面的[refresh]按钮来重现显示系统的当前进程。



选中你想监控的进程, 然后点击窗口下面的[start monitor]按钮



当进程被成功监控以后, [start monitor]按钮将便灰,而[stop monitor][log]2个按钮变为有效。



       在被监控的进程运行一段时间,等待被监控进程占用的内存大幅上升(发生内存泄露)之后,点击[log]按钮,输出内存监控报告

 

        输出的内存监控报告文件放到了目标进程所在目录,以进程的名称+时间+.Log构成。

        因为被监控以后,进程的运行效率并未完全降低, 所以可以在生产环境, 让用户一直挂着该工具, 监控内存泄露情况, 知道有内存泄露发现时, 才输出测试报告, 分析内存泄露的原因。

        输出的报告文件所在的目录

       


 

二. 可以在程序启动时就监控内存分配情况,记录未释放的内存

    首先在命令前增加启动程序InsertDll.exe , 这样程序一启动就开始了监控     

    打印泄露报告的办法和上面的“监控已经运行的程序”相同

 

三. 以文本方式打开内存泄露报告文件

可以看到该报告文件记录了进程在输出报告时, 占用的物理内存, 虚拟内存, 进程中的模块基地址, 模块名称, 模块的编译时间。以及尚未释放的内存块的地址,大小, 分配时间, 调用栈信息。



 

四. 分析内存泄漏报告  

运行Analyse.exe



点击Anlyse窗口的左上角的[文件][打开]菜单

 


点击[…]按钮, 选择刚才输出的内存监控文件



打开内存监控文件, 分析出还未释放的内存的调用栈信息

如下图:说明一共有5出未释放内存,其中编号为0的调用栈一共有997次分配未释放,一共泄露9970字节的内存。

其他的调用栈都只有一次的内存分配未释放。



 

对于我们来说,那些多次分配未释放的调用栈最有可能是内存泄露的地方

所以,我们选中编号为1的调用栈, 点击按钮[调用栈], 查看该调用栈的详细信息



 

可以看出是在test函数中分配未释放内存

另外, 我们还可以查看从监控开始到打印输出文件为止的内存分配未释放的曲线图, 点击[全局时序图]按钮



也可以点击[时序图]按钮查看选中的调用栈的内存分配未释放的时序图

也可以选择窗口左上的[模块][模块列表]菜单,查看进程的模块, 以及这些模块的符号文件是否正确加



在模块列表窗口,选中那些符号未加载成功的模块, 可以单独为该模块加载符号文件



为模块加载符号文件



 

可以输入印象文件以及符号文件的具体位置,以便为模块加载符号文件

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐