解决 Symbian OS 内存泄露的好工具 - HookLogger!

本文介绍了一款用于SymbianOS系统的内存泄露检测工具HookLogger,并提供了详细的使用指南及HookEUSER.pl脚本配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

解决 Symbian OS 内存泄露的好工具 - HookLogger!

 

再次感谢诺基亚论坛的 beover1984 提供帮助!

【参考文章】:http://www.symbian.net.cn/blog/post/5.html

声明:虽然上面的【参考文章】标题是 Use HookLogger to trace memroy leak in S60 3rd SDK ,但 S60 第二版也适用!

需要说明的是 EPOCROOT 是在 Windows 系统变量中改的且前后都要有“/”(不是 Windows 下用的“/”)

也可以不用系统变量而直接使用下面的 perl 代码 替换 HookEUSER.pl 的内容 , 并把第53行改为你的 SDK 路径(注意无盘符):

 1 #  HookEUSER.pl
 2
 3 use  strict;
 4 use  FindBin qw( $Bin );
 5
 6 my   $badArg   =   0 ;
 7 my   $remove   =   0 ;
 8 my   $platform ;
 9 my   $release   =   " UDEB " ;
10 my   $arch ;
11 if ($ # ARGV >= 0)
12 {
13      my   $arg   =   0 ;
14      if ( $ARGV [ 0 =~  m !^ [ -/ ]r$ ! i)
15     {
16          $remove   =   1 ;
17          ++ $arg ;
18     }
19      if ($ # ARGV >= $arg && $ARGV[$arg] =~ /^wins(cw)?$/i)
20       {
21             $platform   =   $ARGV [ $arg ];
22             $arch   =  ( $platform   =~   /^ wins$ / i) ?   " eka1 " :   " eka2 " ;
23            ++ $arg ;
24     }
25      while ($ # ARGV >= $arg && $ARGV[$arg] =~ /^(udeb|urel|eka1|eka2)$/i)
26       {
27            if ( $ARGV [ $arg =~   /^ (udeb | urel)$ / i)
28           {
29                 $release   =   $ARGV [ $arg ];
30         }
31          else
32         {
33              $arch   =   $ARGV [ $arg ];
34         }
35
36            ++ $arg ;
37     }
38      $badArg   =  ($ # ARGV >= $arg);
39 }
40
41 if ( $badArg   ||   ! defined ( $platform ))
42 {
43      print   << USAGE_EOF;
44 usage :  HookEUSER . pl [ - r]  < PLATFORM >  [RELEASE] [ARCH]
45 where :   < PLATFORM >   ==  WINS  |  WINSCW
46        [RELEASE]   ==  UDEB  |  UREL (default  ==  UDEB)
47        [ARCH]      ==  EKA1  |  EKA2 (default  ==  EKA1  for  WINS ,  EKA2  for  WINSCW)
48         - r restores original EUSER . DLL
49 USAGE_EOF
50      exit ( 0 );
51 }
52
53 my   $path   =   " /Symbian/8.0a/S60_2nd_FP2_SC/epoc32/release/wins/udeb " ;
54 chdir ( $path ) or  die   " Failed setting cwd to $path " ;
55 my   $euser   =   " euser.dll " ;
56 my   $euser_orig   =   " euser.orig.dll " ;
57 my   $hooks   =   " EUserParasite_$arch.dll " ;
58 my   $hooks_src   =   " $Bin/$hooks " ;
59 die   " Can't find / " $hooks_src / ""   unless   - $hooks_src ;
60 print   " Target path is $path/n " ;
61 die   " Can't find / " $euser / "  - wrong drive, arguments, or EPOCROOT env var? "   unless   - $euser ;
62 if ( $remove )
63 {
64      die   " Can't find / " $euser_orig / "  - was EUSER.DLL hooked by this script? "   unless   - $euser_orig ;
65      unlink   $euser  or  die   " Can't delete hooked EUSER.DLL - is emulator (etc) running? " ;
66      rename ( $euser_orig ,   $euser ) or  die   " Failed renaming $euser_orig to $euser " ;
67      print   " Restored $euser from $euser_orig; hooks no longer in place/n " ;
68 }
69 else
70 {
71      die   " / " $euser_orig / "  present - has EUSER.DLL already been hooked? "   if   - $euser_orig ;
72      my   $hooked_euser   =   " $euser.HOOKED " ;
73      unlink   $hooked_euser ;     #  earlier attempt may have died with "in use", etc
74      my   $cmd   =   " copy / " $hooks_src / "" ;
75      $cmd   =~  tr -/-//- ;
76      system ( $cmd ==   0  or  die   " Failed running / " $cmd / "" ;
77      $cmd   =   " / " $Bin / AttachDll / "  $euser $hooks $hooked_euser " ;
78      system ( $cmd ==   0  or  die   " Failed running / " $cmd / "" ;
79      rename   $euser ,   $euser_orig  or  die   " Failed renaming $euser to $euser_orig - is emulator (etc) running? " ;
80      rename   $hooked_euser ,   $euser  or  die   " Failed renaming $hooked_euser to $euser " ;
81      print   " Modified $euser to hook $hooks, original is $euser_orig./nRun HookEUSER with -r to restore/n " ;
82 }
83


这样你只要安装完 HookLogger 并按照上面的方法更新 HookEUSER.pl,再按照【参考文章】运行程序就行了。
程序的使用很简单,这里不再赘述。
定位到内存泄露的地方后剩下的事就交给你了~~ 

 

转载自:http://www.cppblog.com/JavaCS/archive/2007/08/28/31029.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值