手机内存检测PPT演示文稿

上传人:日度 文档编号:151063009 上传时间:2020-11-11 格式:PPT 页数:29 大小:744KB
返回 下载 相关 举报
手机内存检测PPT演示文稿_第1页
第1页 / 共29页
手机内存检测PPT演示文稿_第2页
第2页 / 共29页
手机内存检测PPT演示文稿_第3页
第3页 / 共29页
手机内存检测PPT演示文稿_第4页
第4页 / 共29页
手机内存检测PPT演示文稿_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《手机内存检测PPT演示文稿》由会员分享,可在线阅读,更多相关《手机内存检测PPT演示文稿(29页珍藏版)》请在金锄头文库上搜索。

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

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

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

4、tf(CIavpMsg()rn); ; class CLogMsg:public CIavpMsg public: CLogMsg() CLogMsg() printf(CLogMsg()rn); public: string m_sTime; ;,int _tmain(int argc, _TCHAR* argv) CIavpMsg* pMsg = new CLogMsg(); string ,8,内存泄漏原因分析,9,内存泄漏原因分析,delete一个只有声明没有定义的类 为了避免C/C+头文件中包含很多的其他头文件,通常将关联到的其他类型声明一下即可, 在真正使用的地方包含其类定义的头文

5、件。 如果在某个地方delete一个只有声明,而没有包含其类定义的头文件,那么该delete将不会去调用该类的析构函数。其结果和基类析构非虚导致派生类的析构不被调用的后果一样。,#pragma once class CIavpMsg; class CIavpMsgFactory public: /从网络收到的消息创建成一个IavpMsg CIavpMsg* DynamicCreateMsg( const char* pMsgStream, int nStreamLen ); ;,#include stdafx.h #include iavpmsgfactory.h int _tmain ( i

6、nt argc, _TCHAR* argv) CIavpMsgFactory oMsgFactory; CIavpMsg* pMsg = oMsgFactory.DynamicCreateMsg( 0, 0 ); /DoSomeThingWithIavpMsg( pMsg ); delete pMsg; return 0; ,10,内存泄漏原因分析,向容器中不断的添加内容,而不删除内容。 写代码时疏忽,逻辑判断不正确导致此种情况发生。 接口设计不良,容器删除的职责不明。,11,内存泄漏原因分析,class CTTSPlayer public: TTSPlayTaskID PrepareTask

7、( const char* ttstext, TtsPlayResultHandler,Play失败,异步通知给调用者, 调用者认为Play已经失败,没有 必要再去调用Stop接口了,map 容器中保存的对象永远不会被删 除了,直至程序退出,从而导致 内存泄漏!,12,内存泄漏原因分析,指针所有权不明 函数返回一个指针,却没说明该谁释放。,class CRtspClient public: /其他方法声明 /向RTSP服务器发送Option消息,返回服务器的响应结果 char* SendOption(); private: /成员变量声明 ;,返回值要不要delete?,13,内存泄漏原因分析

8、,SDK或第三方库使用不当 FormatMessage方法指定FORMAT_MESSAGE_ALLOCATE_BUFFER则该方法得到的字符串为系统分配,需要LocalFree释放该字符串。,int _tmain ( int 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

9、_STACK_OVERFLOW; DWORD dwRet = :FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, ( LPTSTR ) ,14,内存泄漏检测方法,代码检查 所有的new有没有对应的delete? 基类的析构是否是虚函数? 代码逻辑是否存在漏洞? 调用第三方库接口或者SDK的方法是否正确合理? 仔细阅读编译结果,不要忽视warning.,warning C4150: 删除指向不完整“CIavpMsg”类型的指针;没有调用析构函数,Warning:

10、 代码检查需仔细,每一行都要认真推敲,切忌走马观花!,15,内存泄漏检测方法,单元测试 第三方提供的库只有接口,没有源码。 通过代码检查发现了可疑泄漏模块,对该模块写一个简单单元测试程序,进行压力测试,通过观察内存占用曲线,确定该模块是否存在泄漏。,成功案例: iAvp2.4开发中对nuance的opencalllog和closecallog 的接口进行单元测试,发现nuance此处存在泄漏。,16,内存泄漏检测方法,使用内存泄漏检测工具 在Windows平台下,内存泄漏检测工具一般有三种。 内存实时监控, 如iAvp的showin工具; MS C-Runtime Library内建的检测功能

11、; 外挂式的检测工具,诸如Purify, BoundsChecker等;,17,内存泄漏检测工具,内存实时监控, 如iAvp的showin工具 定时检测内存占用情况,绘制成内存占用曲线。 根据曲线的斜率,显示内存泄漏严重程度。 无法定位内存泄漏的代码。,18,内存泄漏检测工具,MS C-Runtime Library内建的检测功能 使用MS C-Runtime Library调试堆函数。,1. 要使用crt的调试堆函数,首先在程序添加如下语句:,2. 程序退出的地方调用_CrtDumpMemoryLeaks: _CrtDumpMemoryLeaks();,#define _CRTDBG_MAP

12、_ALLOC #include #include ,语句顺序不可改变,3. 程序有多个出口时无需在每个出口调用_CrtDumpMemoryLeaks, 程序的开始处调用_CrtSetDbgFlag 即可: _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );,19,内存泄漏检测工具,MS C-Runtime Library内建的检测功能 内存泄漏报告输出,1. _CrtDumpMemoryLeaks报告默认输出到VS调试输出窗口。,问题1:必须在VS IDE上以调试的方式运行,对于需要进行压 力测试的程序非常不方便。,

13、问题2:在IDE的调试输出窗口分析泄漏报告很不方便。,2. 改变内存泄漏报告的输出位置。,freopen( sDumpFile, w, stderr); _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); _CrtDumpMemoryLeaks(); fclose(stderr);,20,内存泄漏检测工具,MS C-Runtime Library内建的检测功能 内存泄漏报告分析,1. 应用程序没有定义_CRTDBG_MAP_ALLOC,报告输出如下

14、:,Detected memory leaks! Dumping objects - 18 normal block at 0 x00780E80, 64 bytes long. Data: CD CD CD CD CD CD CD CD CD CD Object dump complete.,Detected memory leaks! Dumping objects - C:leaktestleaktest.cpp(20) : 18 normal block at 0 x00780E80, 64 bytes long. Data: CD CD CD CD CD CD CD CD CD CD

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

16、CD CD CD CD Object dump complete.,泄漏内存 的分配号,泄漏内块 的类型,泄漏内存 的地址,泄漏内存 的大小,泄漏内存前16 字节的内容,泄漏内存发 生的位置,22,内存泄漏检测工具,MS C-Runtime Library内建的检测功能 C+使用crt调试堆函数,需要添加如下代码,#ifdef _DEBUG #ifndef DBG_NEW #define DBG_NEW new ( _NORMAL_BLOCK , _FILE_ , _LINE_ ) #define new DBG_NEW #endif #endif,注意:不要将上述代码添加在stl库的头文件前面,否则编译不通过!,23,内存泄漏检测工具,IBM Rational Purify 使用Object Code Insertion技术,无需修改源代码,只需目标程序及其调试符合PDB文件即可。 Purify工作流程,24,内存泄漏检测工具,IBM R

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号