《手机内存检测》PPT课件.ppt

上传人:牧羊曲112 文档编号:5513854 上传时间:2023-07-15 格式:PPT 页数:28 大小:555KB
返回 下载 相关 举报
《手机内存检测》PPT课件.ppt_第1页
第1页 / 共28页
《手机内存检测》PPT课件.ppt_第2页
第2页 / 共28页
《手机内存检测》PPT课件.ppt_第3页
第3页 / 共28页
《手机内存检测》PPT课件.ppt_第4页
第4页 / 共28页
《手机内存检测》PPT课件.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《《手机内存检测》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《手机内存检测》PPT课件.ppt(28页珍藏版)》请在三一办公上搜索。

1、1,内存泄漏检测,2,主要内容,3,内存泄漏的定义,程序中的内存结构程序中内存分为堆、栈、全局/静态存储区和常量存储区.全局常量位于常量存储区.全局变量位于静态数据区.局部变量以及函数参数变量位于栈.使用new/malloc分配的内存位于堆上.,栈,代码区,静态数据区,高端内存区域,常量存储区,堆,低端内存区域,常量存储区域和静态数据区域的内存在程序退出时释放,栈中分配的内存在变量离开其作用域时释放,堆中分配的内存必须显示的释放,4,内存泄漏的定义,内存泄漏的定义程序中从堆中分配的内存在使用完毕后忘记释放,从而失去对该块内存的控制,导致该块内存一直被占用直至程序退出。程序一直分配内存,直到程序

2、退出才释放所有内存。内存泄漏的危害程序占用内存越来越多,使得整个系统运行速度越来越慢。糟糕者可用内存耗尽,应用程序崩溃。,5,内存泄漏的定义,内存泄漏的分类常发性内存泄漏发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。一次性内存泄漏发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。偶发性内存泄漏发生内存泄漏的代码只会被执行一次隐式内存泄漏程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存,6,内存泄漏原因分析,new出来的对象没有dele

3、te代码中没有delete的地方指针被重新赋值了,赋值前没有delete逻辑分支考虑不全。函数内部逻辑考虑不周。接口调用时序逻辑考虑不全,CUDPSocket*CreateUdpSocket(const std:string,内存泄漏原因分析,基类析构函数非虚当基类指针指向派生类对象,delete该基类指针时派生类对象的析构不会被调用。如果派生类中使用了stl容器或者从堆中分配内存的作为成员变量,那么内存泄漏就悄无声息的发生了。,7,class CIavpMsgpublic:CIavpMsg()CIavpMsg()printf(CIavpMsg()rn);class CLogMsg:publi

4、c CIavpMsgpublic:CLogMsg()CLogMsg()printf(CLogMsg()rn);public:string m_sTime;,int _tmain(int argc,_TCHAR*argv)CIavpMsg*pMsg=new CLogMsg();string,内存泄漏原因分析,8,内存泄漏原因分析,delete一个只有声明没有定义的类 为了避免C/C+头文件中包含很多的其他头文件,通常将关联到的其他类型声明一下即可,在真正使用的地方包含其类定义的头文件。如果在某个地方delete一个只有声明,而没有包含其类定义的头文件,那么该delete将不会去调用该类的析构函数

5、。其结果和基类析构非虚导致派生类的析构不被调用的后果一样。,9,#pragma onceclass CIavpMsg;class CIavpMsgFactorypublic:/从网络收到的消息创建成一个IavpMsg CIavpMsg*DynamicCreateMsg(const char*pMsgStream,int nStreamLen);,#include stdafx.h#include iavpmsgfactory.hint _tmain(int argc,_TCHAR*argv)CIavpMsgFactory oMsgFactory;CIavpMsg*pMsg=oMsgFactor

6、y.DynamicCreateMsg(0,0);/DoSomeThingWithIavpMsg(pMsg);delete pMsg;return 0;,内存泄漏原因分析,向容器中不断的添加内容,而不删除内容。写代码时疏忽,逻辑判断不正确导致此种情况发生。接口设计不良,容器删除的职责不明。,10,内存泄漏原因分析,11,class CTTSPlayerpublic:TTSPlayTaskID PrepareTask(const char*ttstext,TtsPlayResultHandler,Play失败,异步通知给调用者,调用者认为Play已经失败,没有必要再去调用Stop接口了,map容器

7、中保存的对象永远不会被删除了,直至程序退出,从而导致内存泄漏!,内存泄漏原因分析,指针所有权不明函数返回一个指针,却没说明该谁释放。,12,class CRtspClientpublic:/其他方法声明/向RTSP服务器发送Option消息,返回服务器的响应结果 char*SendOption();private:/成员变量声明;,返回值要不要delete?,内存泄漏原因分析,SDK或第三方库使用不当FormatMessage方法指定FORMAT_MESSAGE_ALLOCATE_BUFFER则该方法得到的字符串为系统分配,需要LocalFree释放该字符串。,13,int _tmain(in

8、t argc,_TCHAR*argv)TCHAR*buffer=new TCHAR100;TCHAR*pClone=buffer;ZeroMemory(pClone,100);TCHAR*s=orig orig orig orig;memcpy(pClone,s,strlen(s);DWORD error=ERROR_STACK_OVERFLOW;DWORD dwRet=:FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,error,0,(LPTSTR),内存泄漏检测方法,代码检查所有的ne

9、w有没有对应的delete?基类的析构是否是虚函数?代码逻辑是否存在漏洞?调用第三方库接口或者SDK的方法是否正确合理?仔细阅读编译结果,不要忽视warning.,14,warning C4150:删除指向不完整“CIavpMsg”类型的指针;没有调用析构函数,Warning:代码检查需仔细,每一行都要认真推敲,切忌走马观花!,内存泄漏检测方法,单元测试第三方提供的库只有接口,没有源码。通过代码检查发现了可疑泄漏模块,对该模块写一个简单单元测试程序,进行压力测试,通过观察内存占用曲线,确定该模块是否存在泄漏。,15,成功案例:iAvp2.4开发中对nuance的opencalllog和clos

10、ecallog的接口进行单元测试,发现nuance此处存在泄漏。,内存泄漏检测方法,使用内存泄漏检测工具 在Windows平台下,内存泄漏检测工具一般有三种。内存实时监控,如iAvp的showin工具;MS C-Runtime Library内建的检测功能;外挂式的检测工具,诸如Purify,BoundsChecker等;,16,内存泄漏检测工具,内存实时监控,如iAvp的showin工具 定时检测内存占用情况,绘制成内存占用曲线。根据曲线的斜率,显示内存泄漏严重程度。无法定位内存泄漏的代码。,17,内存泄漏检测工具,MS C-Runtime Library内建的检测功能 使用MS C-Run

11、time Library调试堆函数。,18,1.要使用crt的调试堆函数,首先在程序添加如下语句:,2.程序退出的地方调用_CrtDumpMemoryLeaks:_CrtDumpMemoryLeaks();,#define _CRTDBG_MAP_ALLOC#include#include,语句顺序不可改变,3.程序有多个出口时无需在每个出口调用_CrtDumpMemoryLeaks,程序的开始处调用_CrtSetDbgFlag 即可:_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);,内存泄漏检测工具,MS C-Runtim

12、e Library内建的检测功能 内存泄漏报告输出,19,1._CrtDumpMemoryLeaks报告默认输出到VS调试输出窗口。,问题1:必须在VS IDE上以调试的方式运行,对于需要进行压力测试的程序非常不方便。,问题2:在IDE的调试输出窗口分析泄漏报告很不方便。,2.改变内存泄漏报告的输出位置。,freopen(sDumpFile,w,stderr);_CrtSetReportMode(_CRT_WARN,_CRTDBG_MODE_FILE);_CrtSetReportFile(_CRT_WARN,_CRTDBG_FILE_STDERR);_CrtDumpMemoryLeaks();

13、fclose(stderr);,内存泄漏检测工具,MS C-Runtime Library内建的检测功能 内存泄漏报告分析,20,1.应用程序没有定义_CRTDBG_MAP_ALLOC,报告输出如下:,Detected memory leaks!Dumping objects-18 normal block at 0 x00780E80,64 bytes long.Data:CD CD CD CD CD CD CD CD CD CDObject dump complete.,Detected memory leaks!Dumping objects-C:leaktestleaktest.cpp

14、(20):18 normal block at 0 x00780E80,64 bytes long.Data:CD CD CD CD CD CD CD CD CD CD CD CDObject dump complete.,2.应用程序定义了_CRTDBG_MAP_ALLOC,报告输出如下:,_CRTDBG_MAP_ALLOC可以在报告中显示泄漏在文件中发生的位置,内存泄漏检测工具,MS C-Runtime Library内建的检测功能 内存泄漏报告分析,21,Detected memory leaks!Dumping objects-C:leaktestleaktest.cpp(20):18

15、 normal block at 0 x00780E80,64 bytes long.Data:CD CD CD CD CD CD CD CD CD CD CD CDObject dump complete.,泄漏内存的分配号,泄漏内块的类型,泄漏内存的地址,泄漏内存的大小,泄漏内存前16字节的内容,泄漏内存发生的位置,内存泄漏检测工具,22,MS C-Runtime Library内建的检测功能 C+使用crt调试堆函数,需要添加如下代码,#ifdef _DEBUG#ifndef DBG_NEW#define DBG_NEW new(_NORMAL_BLOCK,_FILE_,_LINE_)#

16、define new DBG_NEW#endif#endif,注意:不要将上述代码添加在stl库的头文件前面,否则编译不通过!,内存泄漏检测工具,IBM Rational Purify使用Object Code Insertion技术,无需修改源代码,只需目标程序及其调试符合PDB文件即可。Purify工作流程,23,内存泄漏检测工具,IBM Rational PurifyPurify的使用,24,1.加载程序,内存泄漏检测工具,25,2.分析报告,内存泄漏检测工具,IBM Rational Purify 不足之处,26,1.跑大型复杂程序比较费劲,对服务器环境要求较高,有时程序无法启动,1.不是免费的,破解版稳定性较差,内存泄漏防范,内存泄露防范几点建议,27,建议1:少使用new,除非必须使用。,建议2:使用智能指针。,建议3:如果一个接口的实现中有分配内存动作,必须有一个对应的释放接口。,建议4:复杂逻辑的代码段最好使用结对编程。,建议5:版本构建前,使用C-Runtime Library堆调试加强单元测试。,28,28,讨论,你有什么更好的经验,说出来大家一起分享下!,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号