在程序调用了__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是个好习惯,最后要匹配下是否分配和释放都能对应。
------解决方案--------------------------------------------------------
堆检查宏用在模块处理的时候还比较好用,用在系统集成里面就不太好用了。个人意见。
而且堆检查宏并不能告诉你准确的泄露位置。