解决 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 路径(注意无盘符):
#
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
|
WINSCW46
[RELEASE]
==
UDEB
|
UREL (default
==
UDEB)47
[ARCH]
==
EKA1
|
EKA2 (default
==
EKA1
for
WINS
,
EKA2
for
WINSCW)48
-
r restores original EUSER
.
DLL49
USAGE_EOF50
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
-
e
$hooks_src
;60
print
"
Target path is $path/n
"
;61
die
"
Can't find /
"
$euser
/
"
- wrong drive, arguments, or EPOCROOT env var?
"
unless
-
e
$euser
;62
if
(
$remove
)63
{64
die
"
Can't find /
"
$euser_orig
/
"
- was EUSER.DLL hooked by this script?
"
unless
-
e
$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
-
e
$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
本文介绍了一款用于SymbianOS系统的内存泄露检测工具HookLogger,并提供了详细的使用指南及HookEUSER.pl脚本配置方法。
1082

被折叠的 条评论
为什么被折叠?



