今天调试一个 程序时,始终在退出时要报alloc错误,很明显,是某个地方产生了内存泄露,但一行行的看代码分析实在不是一个良策,google了一些发现有个叫 HookLogger的工具,专门用于查找内存漏洞,而且口碑极好,down下来一试,果然药到病除,不敢私藏,与大家共勉。
1、下载HookLogger.zip,地址:http://developer.symbian.org/wiki/index.php/File:HookLogger.zip
2、安装:(我使用的是S60 3rd MR版)
解压HookLogger_Setup.zip后运行安装程序,可按默认安装,我安装在D:/Symbian/HookLogger,避免路径中产生空格。
1)在系统的环境变量设置里,添加环境变量EPOCROOT,其值为/Symbian/9.1/S60_3rd_MR/
2)在S60 3rd下使用HookLogger,有些文章中说如果sdk和HookLogger的安装路径中带有空格,稍微有些问题,修改如下:
用记事本打开文件C:/Program Files/Common Files/Symbian/tools/HookEUSER.pl
(但我的系统中没有这个文件,可能跟其他人的版本不一样)
替换
my $cmd = "copy $hooks_src";
为
my $cmd = "copy /"$hooks_src/"";
以及替换
$cmd = "$Bin/AttachDll $euser $hooks $hooked_euser";
为
$cmd = "/"$Bin/AttachDll/" $euser $hooks $hooked_euser";
保存后退出。
3)打开cmd窗口,进入到HookLogger的安装目录,输入SetupHooks.cmd,得到如下窗口:
说明EUser.dll还没有被hook,接下来输入 SetupHooks.cmd S60_3rd_MR:com.nokia.s60,得到如下窗口:
说明EUser.dll已被正确替换,可以用来hook啦。
3、使用:
1)先从开始菜单启动HookLogger,选择"Filters"页,摁下"Browse for EXE"按钮,找到你想分析的发生泄漏的可执行文件。在下拉框中选择"Include only checked"。如图:
2)然后启动Emulator。HookLogger will be connected to the emulator and you will get the confirmation on the Title bar. 在运行自己的程序之前,go to the Heap tab and press "Mark".此时,运行你的程序,再现MemLeak直到异常退出。然后转到 HookLogger的Heap页,Now press "Check" in the HookLogger Heap tab. You will get listing of memory allocations for your application.
Search for the memory leaking pointer( in my case it is 301acec0 ) from the list. Double click on the pointer or press "Alloc Details". You will get the stack. From the stack you can find source file locations for the memory allocations. If you click on a particular memory allocation it will point to the source line of allocation.
双击"ConstructL"定位到源代码:
哈哈,原来是gridM搞的鬼,注释掉,一切OK!
4、卸载:
执行:SetupHooks.cmd S60_3rd_MR:com.nokia.s60 --r 即可。
注意:
有部分人会遇到在启动Emulator的时候,发生“Ordinal 1905 missing from dll”的问题,直接点击提示框的叉叉,不是中间的OK键,再按(Debug)F8,之后可正常使用HookLogger。
HookLogger的确是一个非常好的工具,发生内存泄漏但无法解决时,强烈推荐大家使用!!