S60 3rd下如何使用HookLogger查找内存泄漏错误

来源:互联网 发布:淘宝查号的二维码 编辑:程序博客网 时间:2024/05/01 04:52

by dyw  

http://blog.csdn.net/dyw/archive/2007/09/09/1777678.aspx

近日,在一个S60 3rd的项目里,调试一个内存泄漏错误,总也找不到是哪里出了问题。
想到以前曾碰到过一个HookLogger的工具可以检测内存泄漏,于是就下载过来。
试用了一下效果相当不错,很快就找到了发生错误的位置。
下面具体描述在S60 3rd环境下怎么安装与使用HookLogger:

1、下载:
http://developer.symbian.com/main/downloads/files/HookLogger_Setup.zip

2、安装:(假定使用的是S60 3rd MR版)
解压HookLogger_Setup.zip后运行安装程序,按默认安装。

在S60 3rd下使用HookLogger,稍微有些问题,修改如下:
1) 在系统的环境变量设置里,添加环境变量EPOCROOT,其值为/Symbian/9.1/S60_3rd_MR/
2) (可用记事本)打开文件
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)打开一个控制台(DOS窗口),改变当前目录为:
C:/Program Files/Common Files/Symbian/tools
然后运行
hookeuser winscw

3、使用:
先启动HookLogger,然后启动Emulator。运行你的程序,再现MemLeak直到异常退出。这时,转到HookLogger的Heap页,点击下面的按钮“List All Allocs”将列出发生内存泄漏的地址。然后双击某条信息即可查看明细情况,甚至可以打开源代码文件,非常方便!

详情可参考[注2]。

4、卸载:
参考2.3,运行
hookeuser -r winscw

评:HookLogger是一个好工具,在对内存泄漏毫无头绪时,可帮你迅速找到问题之所在。


[注1] http://developer.symbian.com/main/tools/devtools/code/index.jsp#debugging
[注2] http://www.symbian.net.cn/blog/post/5.html

在使用Symbian进行开发时经常会忘记释放我们曾经使用过的内存或指针,从而导致我们在模拟器中最后退出软件时会爆出提示,而检验遗漏的内存是程序员的天职所在,所以我们要想做好Symbian的开发,就必须熟悉如何查找内存,而Symbian SDK中提供了一个很好的工具HookLogger用来检验我们的内存操作。
     下面所提到的是2008年5月1日版(0.423 rc版)
     下载:
      http://developer.symbian.com/main/downloads/files/HookLogger.msi这个是官方的链接地址。
     安装:
     至于安装并没有像很多文章中所说的那么复杂,我只是安装在默认的目录,而官方的视频教程(后面会提到,也给过链接吧)也是一个象征性的地址。
     使用:
     我也就不多说了,官方的视频教程(http://developer.symbian.com /main/tools_and_sdks/developer_tools/supported/hook_logger/intro.htt)说的很清楚。如果有些地方因为网速不能打开,那我就做个小的介绍。
     1、安装完毕后启动HookLogger的应用程序,这是可以启动模拟器,一般会有一个提示说是你的HookLogger和模拟器没有Hook上,你就直接点击确定并关闭模拟器(不要急着把HookLogger也关了)。
      2、设置系统环境变量,新建一个环境变量,名称为epocroot,变量值为/Symbian/9.1/S60_3rd。重新启动操作系统。
     3、打开Windows的命令控制台(开始菜单中单击运行,输入cmd然后就按下回车),跳转到你所安装的HookLogger的目录(如默认的 C:/Program Files/HookLogger,这里要在控制台中输入 cd C:/Program Files/HookLogger然后回车),输入命令SetupHooks,回车;会弹出一些提示信息,接着输入SetupHooks epocroot, 回车。
     4、在HookLogger的Filters的Tab页面中,左侧的下拉菜单中选择Include only checked,在下面的Browse for EXE的按钮中选中你要进行调试的那个工程的模拟器对应的exe程序,一般在C:/Symbian/9.1/s60_3rd/release /winscw/udeb/中,而文件名一般是你的工程名。
     5、设置完毕后启动模拟器,在模拟器中运行你要调试的那个程序,直到退出时爆出 Alloc ********(16位的地址),这时在HookLogger的Heap的Tab,单击第三个按钮(List all alloc),你会发现该页面中有一列Ptr,在这一列中找到你的那个对应的地址(Alloc中的********),然后用鼠标选中这一行,单击下面的第四个按钮(Alloc details)这时会弹出一个对话框,找到第一个有关你的类名及函数名的位置(这里就是根源所在),在#后的数字就是你的内存泄露所在的位置。
    6、跳到你的源文件中步骤4的位置,找出你的内存泄露出现在哪里,这样你就可以进行下一步调试了。

      以上方法本人初步研究可以很好的运行,有问题大家在相互交流。

原创粉丝点击