资源预览内容
第1页 / 共48页
第2页 / 共48页
第3页 / 共48页
第4页 / 共48页
第5页 / 共48页
第6页 / 共48页
第7页 / 共48页
第8页 / 共48页
第9页 / 共48页
第10页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Windows Embedded从入门到精通系列课程从入门到精通系列课程 WinCE内存泄漏的检测和防范内存泄漏的检测和防范黄文中 Wi CE/XPE培训讲师MVPWinCE/XPE培训讲师 eMVP 研博科技有限公司研博科技有限公司研博科技有限公司研博科技有限公司 http:/wince.cn/本次课程内容包括本次课程内容包括本次课程内容包括本次课程内容包括? 内存分配机制 ?各种内存工具的工作原理 ?有无内存泄漏的判定?有无内存泄漏的判定 ?定位内存泄漏的代码 ?防范内存泄漏的编程指引 ?D i及Aliti测漏实例D?Driver及Application测漏实例Demo收听本次课程需具备的条件收听本次课程需具备的条件收听本次课程需具备的条件收听本次课程需具备的条件熟悉: 32位的嵌入式CPU架构,熟悉:32位的嵌入式CPU架构, X86/ARM,及其MMU等 Wi CE系统调用机制 Cdll dll等 WinCE系统调用机制, Coredll.dll等 C/C+编程经验编程 Debug及Log经验Level 200涉及的问题涉及的问题 WinCE特有的系统有内存碎片的回收功能 问题一:WinCE系统是否有内存碎片的回收功能? 答案一:没有像台式机的自动回收,只有当内存不够时才回收低优 先级的线程堆和栈 主要由用户自己处理内存NCF除外先级的线程堆和栈.主要由用户自己处理内存.NetCF除外.问题如何才能不产生内存碎片? 问题二:如何才能不产生内存碎片? 答案二:首先分配和释放应当对称,顺序是按栈式分配和释放(即 按1 2 3顺序分配 3 2 1顺序释放) 可以避免内存碎片的产生按1-2-3顺序分配,3-2-1顺序释放),可以避免内存碎片的产生.问题三 如果有了内存碎片 什么情况下能重新利用内存碎片? 问题三:如果有了内存碎片,什么情况下能重新利用内存碎片? 答案三:如果无法按栈式分配和释放,产生了内存碎片.只要每次 分配都是固定一样的大小 在分配和释放总数相等时 内存最大需分配都是固定一样的大小,在分配和释放总数相等时,内存最大需 求量不会增长,因为碎片的大小正是要分配的大小,可以再利用.涉及的问题 问题四:如何判断是否有内存泄漏? 答案四:通过GlobalMemoryStatus查看内存使用率是否答案四:通过GlobalMemoryStatus查看内存使用率是否 不停地增长, 有就是有内存泄漏.也可以使用Performance Moniter等工具. 问题五:内存泄漏检测工具的一般做什么工作?问题内存泄漏检测具的般做什么作 答案五:拦截测试模块的内存相关API调用,记录调用时的 堆栈快照(LOG),对分配出的内存加标识(TAG).验证分配和 释放是否配对.Handle/Object等内核对象的使用是否规范 ,以及对照Symbol文件找错误代码. 问题六:哪些API函数与内存泄漏有关,需要监控? 答案六: 主要有(1)Virtual/Heap/MappingFile. (2)Handle相关. (3)GDI对象相关涉及的问题 问题七:如何定位模块代码中内存泄漏的错误行? 答案七:首先要有模块编译时产生的Symbol文件,对照检测 工具制作的泄漏点的堆栈快照.以定位错误代码的地点. 问题八:举例哪些工具可以用来查找和定位内存泄漏? 答案八:大多数检测工具的工作原理是相似的,及加TAG和 写LOG. Application Verifier是微软的已文档化的推荐 工具 还有其他很多第三方的工具工具.还有其他很多第三方的工具. 问题九内存泄漏在什么情况下是致命危险的? 问题九: 内存泄漏在什么情况下是致命危险的? 答案九: 在不退出的程序的死循环中有内存泄漏是致命危 险的 如进入windows消息循环中的内存泄漏险的.如进入windows消息循环中的内存泄漏.AgendaAgenda?内存分配机制?内存分配机制?因为API是唯一的调用接口,监控API调用是解决问题的 关键关键 ?各种内存工具的工作原理 有无内存泄漏的判定?有无内存泄漏的判定 ?定位内存泄漏的代码定位内存泄漏的代码 ?防范内存泄漏的编程指引 测漏实例?Driver及Application测漏实例Demo内存分配机制内存分配机制存管蔽件向序 内存管理的目的:屏蔽硬件地址,向应用程序 和内核程序提供各2G(共4G)的虚拟内存地内核程序供各(共)虚内存 址,在MMU硬件的协助下,实现虚拟地址到硬 件地址的多对一映射 使内存资源得到充分件地址的多对映射.使内存资源得到充分 合理地使用. 内存管理的操作 预留 建立 取消多对的 内存管理的操作:预留,建立, 取消多对一的 虚实映射. 程序对内存的操作:读(运行),写WinCE的微内核框架WinCE 6.0 框架框架框架框架应用程序监视此处应用程序监视此处驱动程序监视此处驱动程序监视此处驱动程序监视此处驱动程序监视此处WinCE的微内核框架WinCE 5.0 框架框架框架框架驱动及应用程序都驱动及应用程序都 监视此处监视此处监视此处监视此处系统运行机制系统运行机制管在户空在系空存 不管是在用户空间还是在系统空间分配内存, 都是API调用.都是调用由此决定了监视内存相关的API函数调用是解 由此决定了监视内存相关的API函数调用是解 决问题的关键AgendaAgenda? 内存分配机制 ?各种内存工具的工作原理?Tag和Log 加Symbol和各种API使用规则和规范?Tag和Log,加Symbol和各种API使用规则和规范 ?有无内存泄漏的判定 ?定位内存泄漏的代码 ?防范内存泄漏的编程指引?防范内存泄漏的编程指引 ?Driver及Application测漏实例Demo如何监视API调用如何监视API调用系提供功 WinCE系统提供了相关功能.即可以 截获内存相关API函数 在进入内核的API实截获内存相关API函数,在进入内核的API实 现之前,一般再做以下两件事: (1) 分配区域 在周边加入标识(TAG) 释放时清除 (1),分配区域,在周边加入标识(TAG), 释放时清除 标识(TAG), 通过查找(TAG)的残存, 判断分配和释放是否配对判断分配和释放是否配对. (2),产生日志(LOG),记录当时调用堆栈的快照.以 件代在便对照symbol文件,定位错误代码所在的位置. (3),由一组Shim XXX.DLL完成,分别截获一(3),由组Shim_XXX.DLL完成,分别截获 组的APIAgendaAgenda? 内存分配机制 ?各种内存工具的工作原理 ?有无内存泄漏的判定?有无内存泄漏的判定?Tag, Log的使用 ?定位内存泄漏的代码 ?防范内存泄漏的编程指引?防范内存泄漏的编程指引 ?Driver及Application测漏实例Demo内存泄漏的定义 申请内存后,不及时释放的行为. 内存泄漏分两种: (1)无限泄漏 由不退出的驱动或程序造成 症 (1)无限泄漏,由不退出的驱动或程序造成,症 状是内存使用率不停地增长.对WinCE来说, 危害是灾难性的 系统崩溃危害是灾难性的-系统崩溃 (2)有限泄漏,内存使用率增长到一定值后保( )有限漏,内存使用率增到定值后保 特稳定.危害是浪费资源,系统不一定崩溃. 对于无限泄漏的检测:思路是不断地定时查 对于无限泄漏的检测:思路是不断地定时查 询内存状态,比较内存使用率,如果增长不断 直致系统崩溃 即可断定存在无限泄漏直致系统崩溃.即可断定存在无限泄漏.有无内存泄漏的判定有无内存判定分配和释放是否配对是否使用规范 Log,分配和释放是否配对,Handle/Object是否使用规范 .API的(C语言)困扰,.NET CF弥补缺陷. 分配内存不是要多少就给多少 而是给出的更多 即往往在 分配内存不是要多少就给多少,而是给出的更多,即往往在 给出的区域前后加特征字段(Tag).同时内存管理器在内部 page table中记录这些情况page table中记录这些情况. Demo:环境 内存分配时的包裹特征字段()被加入 用户 Debug环境.内存分配时的包裹特征字段(Tag)被加入,用户 使用时仅限于包裹内的区域,释放时,包裹(Tag)也被清理,所 以在全内存区域内遍查是否有不该遗漏的包裹特征(Tag)以在全内存区域内遍查是否有不该遗漏的包裹特征(Tag),即可初步判断内存泄漏的有无.如何加入(Tag)?如何加入(Tag)?编境生 可以由源码,编译器或Debug环境生成. 例如一:自己写代码重定义分配和释放内存 的函数 分配时加(T)字段 释放时(T)字的函数,分配时加(Tag)字段,释放时(Tag)字 段和实际使用区域一并清理. 例如二:一些类库自带,如MFC等. 例如三些工具 如下面要介绍的 例如三:一些工具,如下面要介绍的 Application Verifier等 AgendaAgenda? 内存分配机制 ?各种内存工具的工作原理 ?有无内存泄漏的判定?有无内存泄漏的判定 ?定位内存泄漏的代码?Symbol文件和调用堆栈Log ?防范内存泄漏的编程指引?防范内存泄漏的编程指引 ?Driver及Application测漏实例Demo定位内存泄漏的代码定位内存泄漏的代码件栈 Symbol文件和调用堆栈Log 比对得到错误代码行比对得到错误代码行AgendaAgenda? 内存分配机制 ?各种内存工具的工作原理 ?有无内存泄漏的判定?有无内存泄漏的判定 ?定位内存泄漏的代码 ?防范内存泄漏的编程指引?死循环和WinCE特征?死循环和WinCE特征 ?Driver及Application测漏实例Demo防范内存泄漏的编程指引 死循环死循环 找到死循环 如消息循环找到死循环,如消息循环. 将分配放在循环外边. 循环内只用循环外边分配好的指针,不在循 环内做分配相关的操作,环内做分配相关的操作, 尤其注意GDI函数,Select=New,保存Old的, 以便恢复再D l t以便恢复再Delete防范内存泄漏的编程指引 Wi CE特性WinCE特性 WinCE系统没有有内存碎片的回收功能用户自己管理内存C 系统没有有内存碎片的回收功能用户自己管理内存 碎片.Net CF除外. 如何才能不产生内存碎片? 首先分配和释放应当对称,顺 序是按栈式分配和释放(即按123顺序分配,321顺序释放), 可以避免内存碎片的产生. 如果无法按栈式分配和释放,产生了内存碎片.只要每次分 配都是固定一样的大小,在分配和释放总数相等时,内存最 大需求量不会增长 因为碎片的大小正是要分配的大小 可大需求量不会增长,因为碎片的大小正是要分配的大小,可 以再利用.AgendaAgenda? 内存分配机制 ?各种内存工具的工作原理 ?有无内存泄漏的判定?有无内存泄漏的判定 ?定位内存泄漏的代码 ?防范内存泄漏的编程指引 ?D i及Aliti测漏实例D?Driver及Application测漏实例Demo非栈式分配释放,1+2+3+, 1-2-3-,4+,则4Addr!=1Addr#define HEAP_BLOCK_SIZE 2 / allocate heap block 1p char *pbuf1 = (char *) LocalAlloc(LPTR, HEAP_BLOCK_SIZE); RETAILMSG(1, (TEXT(“app2_2a block 1 (%d bytes) at %08Xh“), LocalSize(pbuf1), pbuf1); *pbuf1 = 1; / allocate heap block 2/ allocate heap block 2 char *pbuf2 = (char *) LocalAlloc(LPTR, HEAP_B
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号