2019-07-30版权所有注意保密第1页共6页Symbian下如何检测内存泄露作者项目组案例来源C++关键词SymbianC++1、现象、问题描述在Symbian平台下开发应用程序时,内存的管理和维护显得更加严格,因为对于内存受限系统(SymbianOS)来说,内存显得更加宝贵,手机操作系统(SymbianOS)的设计就是要让用户运行一年半载不出问题的目的,不能因为某一第三方应用程序的内存泄漏导致系统瘫痪重起,这是不能接受的,哪怕你的应用程序泄漏了一个字节。但如果单凭开发或测试人员的手工检查程序中的内存泄漏是不现实的,所有有了工具HookLogger。2、关键过程、根本原因分析HookLogger是基于Windows界面的内存泄露检测工具,下面主要介绍使用HookLogger检测在模拟器下的内存泄露,主要步骤如下:1)HookLogger的安装你可以http://developer.symbian.com/main/tools/devtools/code/index.jsp下载这个工具,也可以直接使用,直接点击安装即可。(推荐按照默认的路径进行安装)2)HookLogger配置首先你需要确认当前你工作的SDK目录,比如现在我们用的3RdEdition的版本,其目录如下:Symbian\9.1\S60_3rd,然后你打开命令行程序,输入HookEUSERwinscw(在Symbian7.0s以及以前的版本输入HookEUSERwins),这样将修改模拟器版本下的euser.dll文件,从而我们可以使用该工具检测内存泄露。输入HookEUSERwinscw命令的时候,可能产生如下的错误Failedsettingcwdtoepoc32/release/winscw/udebatC:\Symbian\HookLogger\HookEUSER.plline54.主要的原因是你配置的环境变量不对,你可以按照如下的方式进行设置:2019-07-30版权所有注意保密第2页共6页如果你的SymbianSDK不是安装在C盘的下,你就要进行如下的修改,在C:\ProgramFiles\CommonFiles\Symbian\tools目录下,打开HookEUSER.pl,将54行修改如下my$path=D:/Symbian/9.1/S60_3rd/Epoc32/release/winscw/udeb;用绝对路径即可。修改后再次输入HookEUSERwinscw你可能出现如下的错误:Thesystemcannotfindthefilespecified.FailedrunningcopyC:\ProgramFiles\CommonFiles\Symbian\Tools\EUserParasite_eka1.dllatC:\ProgramFiles\CommonFiles\Symbian\Tools\HookEUSER.plline76.你需要作如下的修改:找到74行将my$cmd=copy$hooks_src;修改为my$cmd=copy\$hooks_src\;并且将77行修改如下:$cmd=\$Bin/AttachDll\$euser$hooks$hooked_euser;然后再次HookEUSERwinscw,提示信息如下:Targetpathis/Symbian/9.1/S60_3rd_MR/epoc32/release/winscw/UDEB1file(s)copied.Modifiedeuser.dlltohookEUserParasite_eka2.dll,originaliseuser.orig.dll.RunHookEUSERwith-rtorestore表示HookLogger工具配置成功。3)HookLogger的使用在启动模拟器之前,打开HookLogger,2019-07-30版权所有注意保密第3页共6页Threads显示当前所有的线程。然后点击一个存在内存泄露的程序,该程序退出的时候,告诉内存泄露的地址,如图:2019-07-30版权所有注意保密第4页共6页22082f140就是当前程序存在内存泄露的地址,我们点击HookLogger的Heap标签,点击listallallocs的按钮,显示如下:2019-07-30版权所有注意保密第5页共6页红色部分就表示当前内存泄露的地址,双击该列,显示如下:这样我们就可以通过这些信息分析出内存泄露的原因,这样在该类的析够释放这些内存即可。2019-07-30版权所有注意保密第6页共6页3、结论、解决方案及效果使用该工具,能有效地找出深层次的内存泄漏问题,尤其是当项目规模较大时,使用该工具非常高效,用了都说喜欢!!!4、经验总结、预防措施和规范建议使用该工具时,仔细分析出错报告,一来方便定位问题,二来对自己的C++编码能力和对底层编译机制的理解有很大的帮助。使用该工具时要具备以下两点:1、首先你应该是一个C++高级用户,因为这样你才有机会发现代码中细微的差别。2、你必须熟悉SymbianOSAPI的用法和实现机制,否则摆在你面前的内存泄漏你也会认为工具冤枉了你的代码。6、备注无