symbian 内存泄露工具HookLogger

1 关于内存泄露
Symbian中对内存泄露是十分敏感的,一切内存务必及时释放,尤其是字符串指针要特别注意,不要用完了不管。
例子说话:
TDesC* desc;
...
desc = convAscToDesLC( xxx ) ;
      CleanupStack::PushL( desc ) ;
      gc.DrawText( *desc, TPoint( 500, 20 ) );
CleanupStack::PopAndDestroy( desc ) ;
以上代码中,对desc赋值后要记着压栈,用完后不要忘了出栈,否则会导致alloc错误!
2 字符串转换为TDesC类型
TDesC* convAscToDesLC( const char* aAsc )
{
    TPtrC8 ptr(reinterpret_cast <const TUint8*>(aAsc));
    HBufC* buffer = HBufC::NewL(ptr.Length());
    buffer->Des().Copy(ptr);
    return buffer ;
}
3 压栈和出栈操作不匹配
如果在程序中出现压栈和出栈不匹配,会出现E32USER-CBase 71和E32USER-CBase 90错误。
4 怎样定位内存泄露
有一个很好用的Symbian内存跟踪工具hookloger可以用来定位内存泄露,具体到导致内存泄露的c/cpp语句。
下载:http://developer.symbian.com/main/downloads/files/HookLogger.msi这个是官方的链接地址。
使用:
     安装完毕后启动HookLogger的应用程序,这是可以启动模拟器,一般会有一个提示说是你的HookLogger和模拟器没有Hook上,你就直接点击确定并关闭模拟器(不要急着把HookLogger也关了)。
     设置系统环境变量,新建一个环境变量,名称为epocroot,变量值为/Symbian/9.1/S60_3rd。重新启动操作系统。
     打开Windows的命令控制台(开始菜单中单击运行,输入cmd然后就按下回车),跳转到你所安装的HookLogger的目录(如默认的 C:/Program Files/HookLogger,这里要在控制台中输入 cd C:/Program Files/HookLogger然后回车),输入命令SetupHooks,回车;会弹出一些提示信息,接着输入SetupHooks epocroot, 回车。
     在HookLogger的Filters的Tab页面中,左侧的下拉菜单中选择Include only checked,在下面的Browse for EXE的按钮中选中你要进行调试的那个工程的模拟器对应的exe程序,一般在C:/Symbian/9.1/s60_3rd/release /winscw/udeb/中,而文件名一般是你的工程名。
     设置完毕后启动模拟器,在模拟器中运行你要调试的那个程序,直到退出时爆出 Alloc ********(16位的地址),这时在HookLogger的Heap的Tab,单击第三个按钮(List all alloc),你会发现该页面中有一列Ptr,在这一列中找到你的那个对应的地址(Alloc中的********),然后用鼠标选中这一行,单击下面的第四个按钮(Alloc details)这时会弹出一个对话框,找到第一个有关你的类名及函数名的位置(这里就是根源所在),在#后的数字就是你的内存泄露所在的位置。
    跳到你的源文件中步骤4的位置,找出你的内存泄露出现在哪里,这样你就可以进行下一步调试了。
5 把程序部署到设备上
这儿有一个脚本,可以根据此脚本自动生成sis文件,然后连上设备,用Nokia PC Suite将与设备建立连接,双击programname.sis,将程序自动部署到设备上。注意设备上的提示,按提示操作即可。下面是生成sis文件的参考脚本:
@echo off
setlocal

REM /************************************/
REM * buildpkg batch utility           *
REM * for s60 pkg building             *
REM * hgyoo 2007.4.19 oardc-korea      *
REM ************************************/

set gcce=_gcce
set cer=353659010032700.cer
set key=mykey.key
set signer=oracle
set EPOCROOT=/Symbian/9.2/S60_3rd_FP1/
set PLATFORM=gcce
set TARGET=urel

IF "%1" == "" goto arg_error
echo [SIS file name: CompareTest_S60_3_X_v_1_0_0.pkg]
if EXIST CompareTest_S60_3_X_v_1_0_0.pkg goto success
goto file_noexist

:success
echo making sis file
makesis CompareTest_S60_3_X_v_1_0_0.pkg
echo signing sis file using certificate and key with %singer%
signsis CompareTest_S60_3_X_v_1_0_0.SIS CompareTest.SIS %cer% %key% %signer%
goto end

:arg_error
echo please provide a program name as an argument
goto end

:file_noexist
echo file %1%gcce%.pkg does not exist, exiting

:end
@echo on
6 开发中常见错误
KERN-EXEC 0 此错误通常出现在进程或线程使用已经销毁服务对象句柄,如调用了某个对象的Close()方法而继续使用此对象句柄
KERN-EXEC 3 此错误在好多情况下都会产生,最常见的情况通常是由于你使用了空指针,比如在对象没有创建的情况下使用其成员变量或方法
USER 11 内存越界 通常情况下是由于你没有给你的数据分配足够的缓冲区造成的。
USER 130 数组越界,如果你访问的RArray 或RPointerArray 数组下标超过了数组长度则会出现此错误
USER 29 此错误大都是因为对描述符取子串操作索引越界所致
USER 42 此错误通常是由于内存非法访问,比如访问指向无效内存的指针。我通常在调试dll的时候出现此错误,主要是没有执行Freeze由于dll修改。依赖dll主程序没有重写编译。函数访问地址出现错误
E32USER-CBase 71 通常情况下出现此错误由于CleanupStack::PushL() 和 CleanupStack::Pop()不匹配引起的,比如调用了CleanStack::PushL() 而忘记调用 CleanStack::Pop()
E32USER-CBase 63 此错误对应于E32USER-CBase 71 也是由于CleanupStack::PushL() 和 CleanupStack::Pop()不匹配引起的,你可能是过多的调用了CleanStack::Pop()
Avkon 59 在s60 2nd中构造一个视图时 不调用BaseConstructL();不会出现异常,移植到s60 3rd 如果不调用BaseConstructL();系统会提示此错误
关于错误代码 -46 第三版中调用未授权或不可用的服务通常会返回 -46的错误
错误代码 cone -8 通常是由于窗口资源没有释放引起的。确认在程序推出后清除了创建窗口的控件
CONE 44 发生此错误可能是由于你在销毁控件的时候,忘记调用 RemoveFromStack() 移除响应事件的控件。
7 模拟器中配置E盘
修改模拟器配置文件epoc.ini 位置:C:/Symbian/8.0a/S60_2nd_FP2_SC/epoc32/data/epoc.ini 原来的值 _EPOC_DRIVE_D /Symbian/8.0a/S60_2nd_FP2_SC/epoc32/wins/d _EPOC_LocDrv_1 E: 将其改为 _EPOC_DRIVE_D /Symbian/8.0a/S60_2nd_FP2_SC/epoc32/wins/d _EPOC_DRIVE_E /Symbian/8.0a/S60_2nd_FP2_SC/epoc32/wins/e
在C:/Symbian/8.0a/S60_2nd_FP2_SC/epoc32/wins目录下手动创建文件夹e
重启模拟器就OK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值