塞班内存泄露解决.doc
上传人:sy****28 上传时间:2024-09-13 格式:DOC 页数:3 大小:25KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

塞班内存泄露解决.doc

塞班内存泄露解决.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Symbian操作系统C++工程中消除内存泄露JohnPagonis,Symbian开发者网络,2005年1月Symbian操作系统中,编程框架在调试模式下要确保跟踪内存分配,在编译过程中如果终止时出现内存泄露,这个应用程序会被告警.应用程序告警是一种直接和迅速的方式去使开发人员意识到存在内存泄露问题需要被修正.内存泄漏问题需要马上被修正,为了以最低代价完成这个工作,有很多内容需要介绍.另外,开发过程中,在可选择的范围内,你可以自由选择工具来保证手动完成这样的内存检测.你可以在一些代码块的前后设置标记来确保它不泄露内存.实际上,这是编程框架所做的事情,它将标记设置在一个应用程序开始和结束的位置.如果你在Symbian操作系统的C++应用框架以外开发软件,则必须采用这些手动的机制.这些在调试过程中出现的工具是内存分配框架的调用,并且为方便调用已经被封装到宏中(定义在e32def.h中).如:__UHEAP_MARK和__UHEAP_MARKEND.这两个调用合在一起所要做的工作是用来检验一个码块分配内存和释放内存的对应关系.如果出现不对应的地方,他们向违规进程发出警告.当警告发生时,开发人员被告知去跟踪违规的未分配单元.这些工具更详细的使用方法可参照[1][2].1.当出现内存泄露时应该做什么在你进行WINS内存泄露调试之前,同时为了获得更多有用的符号调试信息,将由SDN提供的UIQ2.1PDB文件放到你的\epoc32\release\wins\udeb路径下.对于WINSCWUIQ用户,没必要这样做,因为在他们的调试二进制文件中已经嵌入了那些信息.使用60/80SDK系列的开发人员可以从SDK的lib库文件和dll库文件中编译它们[3].注意,在以下的讨论中,将会使用MicrosoftDeveloperStudio的术语和例子.CodeWarrior用户在他们的环境和工作流程中能够采用类似的技术.1.1跟踪违规的单元因此,当出现异常并且该异常是内存泄露引起时,你应该设法顺稣飧鲇τ贸绦?在那种情况下,系统会提示存在某些单元(cells)没有被删除.通过查询调度栈,找到类似User::__DbgMarkEnd()的函数,就可以找到问题所在.从调用栈(CallStack)窗口,点击User::__DbgMarkEnd(RHeap::TDbgHeapTypeEuser,int0x00000000).在大多数情况下,除非你使用了某些特定的Symbian代码,你将看到的是上述方法的反汇编窗口.这种情况下,将鼠标悬浮在坏单元(badCell)的上方,或者悬停鼠标按Shift+F9,记下提示框中出现的地址.在得到认证的情况下,你将看到上述方法的源代码(在\e32\UCDT\UC_KUSR.CPP中).通过单击鼠标右键(在info.AppendFormat(_L("%x\n"),badCell)上),对坏单元做快速监视.出现在快速监视窗口中的地址就是泄露单元的地址.另一种获得坏单元地址的方法是在出现警告后让仿真器继续进行调试对话(按F5键),然后记下输出窗口中类似'ThreadpanicALLOC:16497110'的消息,这里出现的数字实际上就是坏单元地址的十进制表示.1.2找到泄露对象的标识找到泄露对象的标识需要多做一些工作.如果碰巧是从CBase类继承而来的对象,找到泄露对象的标识是非常简单的,因此,完成这项工作最简单的方法就是检查违规对象是否是C类的一个实例.1.2.1如果它是C-类的一个对象((使用"Watch"监视)或"Quickwatch"快速监视)函数把它当作CBase对象的一个指针.注意,你必须将"0x"写在从剪切板粘贴的十六进制数的前面(如果它以十进制的形式出现,你需要先将它转换成十六进制数).如果它确实是一个C对象,调试器将会告诉你它的类名,在多数情况下,这对解决问题就足够了.如果调试器不能检测到一个虚函数表指针,它将不是一个C对象.此时这种简单的方法就不能用了,我们将不得不尝试其他的技术.这里有两种方法来缩小对象的搜索范围,一种较快但是粗略,另一种较复杂但是精确.1.2.2使用快速数据断点在可疑部分前面的某个位置设置一个断点,但尽量要靠近可疑代码,这是需要技巧的:-).停止调试对话,并且重新运行它.一旦运行到刚才设置的断点时,就通过按"Ctrl+b"增加一个数据断点.这时会出现一个属性表单,在数据标记部分,你应该寻找坏单元地址和字节数目的任何变化,而字节数目通常是4(从坏单元的地址开始).这个操作告诉调试器通知你那个内存位置的任何变化或访问.按F5继续.如果有代码想要修改该内存单