内存与句柄泄露处理技巧(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第二节:利用GDIView而定位GDI泄露问题
• 常用的GDI对象类型
Pen(画笔) - CreatePen - DeleteObject Brush(画刷) - CreateBrush - DeleteObject Bitmap(位图)- CreatecompatibleBitmap CreateDIBitmap CreateBitmap CreateBimtapIndirect - DeleteObject Font(字体)- CreateFont - DeleteObject Palette(调色板)- CreatePalette - DeleteObject Region(区域) - CreateRectRegion - DeleteObject DC(设备内容) - GetDC ReleaseDC – CreateCompatibleDC CreateDC DestroyDC
第一节:利用BoundCheck解决内存泄露
• 系统资源泄露的检测
系统资源如文件句柄资源,信号句柄资源、GDI资源 1、数量 2、释放方法 3、分派位置
第一节:利用BoundCheck解决内存泄露
• 堆溢出的检测
访问内存超过之前分配堆的大小 1、数量 2、位置
第二节:利用GDIView而定位GDI泄露问题
• 内存泄露的检测
内存分配未释放 启动BoundCheck,运行程序 获取分析结果 1、概要信息 2、泄漏信息 3、其他泄漏信息 4、错误信息 5、.NET性能信息 6、加载模块信息 7、记录信息
第一节:利用BoundCheck解决内存泄露
• 内存泄露的检测
1、泄漏次数 2、泄漏大小 3、泄漏位置
第二节:利用GDIView而定位GDI泄露问题
• GDIView所提供的功能
1、可查看进程GDI分配数量 2、可查看进程GDI对象种类 3、可查看进程GDI对象的分配地址与分配时间 4、可增量查看GDI变化

利用GDIView增量确定GDI泄漏
1、开启增量查看规则 2、对检测程序进行操作 3、观察GDI变化增量

VMMap的使用
1、选择进程 2、查看对用类型内存的分配 Commit提交内存大小(数据与代码) Private Bytes 提交的虚拟内存大小 Working Set Bytes工作集内存大小
结束语
• 内容回顾
第一节:利用BoundCheck定位内存泄露 第二节:利用GDIViewer确定GDI泄露 第三节:利用VMMap分析程序内存使用与内存分配规则

处理GDI泄漏的方法
1、弄清楚所有GDI资源的分配和释放方法 2、利用BoundCheck 3、屏蔽代码确定和缩小泄漏范围
第三节:利用VMMap分析内存使用与分配规则
• 内存种类
堆(Heap)内存,栈(Stack)内存 堆内存以增量的方式进行分派堆数据块。64K 256K 1024K 2048K 4M 8M 16M 程序使用的内存由物理内存和虚拟内存构成,win7对应的是任务管理器的提交大小,即为物理内 存和虚拟内存之和。 Image(镜像)内存 加载到进程中的dll,exe程序所占用的内存 Private(私有)内存 利用VirualAlloc分配的内存,无法被其他程序所共享 Shareable(共享)内存 可被其他进程共享的内存 Mapped Files(镜像文件)内存 可共享的表示文件或者磁盘的内存 Manager Heap(托管堆)内存 被.net GC分配出来的私有内存 System(系统)内存 被系统核心使用物理内存
• GDI泄露所导致的问题
系统为每一个进程提供有限的GDI资源数量,为9999个 由于泄漏,超出使用限制之后将出现无法申请到资源的情况,其现象为界面黑掉,后者无法刷新 的ቤተ መጻሕፍቲ ባይዱ题,但程序有可能不会崩溃。

判断GDI泄漏的方法
查看资源管理器的GDI对象数量
资源管理器查看GDI的问题 1、反应有时不够及时和准确 2、不知道GDI的类型 3、无法得到程序进行操作的GDI增量

BoundCheck是什么
运行时错误检测工具,可以在运行时定位各种错误的发生并定位错误位置。

BoundCheck可定位错误的类型
1、指针和泄露错误(内存或资源泄露) 2、内存错误(内存分配冲突,分配堆的溢出,栈的溢出) 3、API调用错误,OLE错误
第一节:利用BoundCheck解决内存泄露
• BoundCheck的安装
VCKBase提供了试用版本的BoundCheck9.1 http://www.vckbase.com/videosupport/debug/ 支持VS2005 VS2008

使用步骤
两种使用方式:VS集成工具、利用ErrorDection工具
第一节:利用BoundCheck解决内存泄露
《VC++ 实战调试技巧》
前言:上节内容回顾与本节内容介绍
主讲人:阳毅超 UIPower CTO
上节内容回顾
WinDbg的基本使用方法 利用WinDbg生成dump与分析dump文件 利用WinDbg进行远程调试 WinDbg的高级调试技巧
本节内容介绍
利用BoundCheck定位内存泄露 利用GDIViewer确定GDI泄露 利用VMMap分析程序内存使用
《VC++ 实战调试技巧》
第三讲:内存与句柄泄露处理技巧
主讲人:阳毅超 UIPower CTO
第一节:利用BoundCheck解决内存泄露
• 使用C++编码最头痛的问题
内存泄露,隐藏很深,难以定位位置,费时,费力 变量初始化,未初始化变量导致运行偶现的错误 错误的内存操作,“踩”了别人的内存偶现崩溃
第三节:利用VMMap分析内存使用与分配规则
• 确定内存的方式
利用任务管理器查看内存使用,存在问题 1、不能确定堆、栈和其他种类内存的使用 2、无法确定堆数据块的实际分配情况

VMMap的特性
VMMap是一个进程虚拟内存物理内存的分析工具 1、可确定内存的种类和分配大小 2、可确定堆实际分配的地址及大小
相关文档
最新文档