当前位置: 代码迷 >> Symbian >> 怎么检测内存泄漏
  详细解决方案

怎么检测内存泄漏

热度:4562   发布时间:2013-02-26 00:00:00.0
如何检测内存泄漏?
在程序调用了__UHEAP_MARKEND这个宏之后,就弹出了“user   breakpoint   called   from   code   at   0x6001da76”。看了宏的定义之后才知道是因为内存中有些资源没有释放。

请问该如何检测哪些资源没有被释放?

------解决方案--------------------------------------------------------
to download Symbian_OS_Basics_Workbook_v3_0_en.pdf in forum nokia
------解决方案--------------------------------------------------------
"Use HookLogger to trace memroy leak in S60 3rd SDK "
http://www.symbian.net.cn/blog/post/5
------解决方案--------------------------------------------------------
有好多的检测工具,不过最好的方法还是写代码的时候小心点!
------解决方案--------------------------------------------------------
有本书上讲了这个方法,个人感觉还不错。
首先正常运行程序,退出之后会有提示,记下这个地址,重新启动调试,在程序入口加断点,然后到IDE的断点对话框里面新建地址断点,地址就是刚才记下的地址,选择当该地址修改时停止。运行程序,当程序停在该断点的时候,查看内存分配,并检查后续程序。
这个方法我只用过几次,还不错。
不过最好的方法的确是养成良好的编码习惯。
------解决方案--------------------------------------------------------
内存泄漏检测工具
第一个工具是一个内存资源使用的监听器.它只能在模拟器上进行调试.可以使用快捷键来调用
CTRL+ALT+SHIFT+A

------解决方案--------------------------------------------------------
堆检测宏
只需要把这些宏加入你要检测的代码部分即可:

功能
__UHEAP_MARK
开始检测堆的使用状况
__UHEAP_CHECK(n)
检测自上一个__UHEAP_MARK是否有’n’个堆被分配(尚未释放)
__UHEAP_CHECKALL(n)
检测是否有’n’个堆已分配
__UHEAP_MARKEND
检测结束,并检测在__UHEAP_MARK之后有没有未被释放的堆
__UHEAP_MARKENDC(n)
检测结束,并检测在__UHEAP_MARK之后有无’n’个未被释放的堆
这是一个简单的使用示例

Code:


CMyClass * a1 =
new(ELeave)CMyClass;

...

__UHEAP_MARK; //开始检测

CMyClass * a2 =
new(ELeave)CMyClass;

CMyClass * a3 =
new(ELeave)CMyClass;

...

__UHEAP_CHECK(2); //检测在__UHEAP_MARK之后有2个堆单元被分测(a2,a3)

__UHEAP_CHECKALL(3); //检测三个堆已被分配(a1,a2,a3)

delete(a2);

__UHEAP_MARKEND; // 结束检测,a3内存泄露

如果想设计驱动程序或内核模块,你可以使用__KHEAP_***宏来检测内核堆.

分配失效工具
用来进行压力测试.你可以使用下列宏

功能
__UHEAP_SETFAIL(aType, n)
可以根据参数的不同来指定下一个内存如何分配.
参数表如下:
EDeterministic:n个请求失败
ERandom:随机失败,n是随机数的种子
ETrueRandom:随机失败
__UHEAP_FAILNEXT(n)
引起下一分配失败
__UHEAP_RESET()

没有及时释放堆上分配的对象,会造成内存泄露。
你可以参考这篇文章学习如何防止这种以外发生
http://www.newlc.com/Tracking-down-...che=memory+leak

另外在分配对象和释放对象时记录log是个好习惯,最后要匹配下是否分配和释放都能对应。


------解决方案--------------------------------------------------------
堆检查宏用在模块处理的时候还比较好用,用在系统集成里面就不太好用了。个人意见。
而且堆检查宏并不能告诉你准确的泄露位置。
  相关解决方案