GDI泄露检测

简介: 前一段在一个仿QQ的IM通讯工具中加入屏幕截图以及截图编辑功能,但是测试中发现当连续进行几十次截图后,系统会出现白屏,开始以为和win7经常闪白有关,屏幕截图截取到闪白的瞬间导致白屏,后来发现是GDI内存不足,申请不到GDI内存贴图失败所致。

前一段在一个仿QQ的IM通讯工具中加入屏幕截图以及截图编辑功能,但是测试中发现当连续进行几十次截图后,系统会出现白屏,开始以为和win7经常闪白有关,屏幕截图截取到闪白的瞬间导致白屏,后来发现是GDI内存不足,申请不到GDI内存贴图失败所致。于是找了GDI泄露的工具,对程序进行GDI内存检测,下面就介绍两款GDI泄露检测工具的用法以及GDI编程的一些注意事项。

第一款:GDIndicator 支持win7+xp 下载地址

1、启动待检测的程序和GDIndicator,启动顺序没有要求,之后F5刷新,就能看到系统中所有进程,和使用的资源数

找到想要查看的进程,这里我们的程序是 TPCommonControlTest,双击进入没有释放的GDI对象列表

 

在左边list控件中单击GDI对象,即可查看,对于可用bitmap对象,还可以看缩略图。

2、进行可能引起泄露的操作,并复原,对本程序来说,就是打开聊天窗口,屏幕截图,并关闭聊天窗口。

     如果没有GDI泄露,在进行上述操作后,GDI对象应该没有改变,如果改变了,根据差值,查找泄露的GDI对象。

3、下图是进行操作后,的GDI对象使用情况,根据差值,重点分析有哪些泄露




根据对比发现,新增了1个bitmap2个dc对象,然后双击TPCommonControlTest进程,结合代码分析,看哪些地方使用DC了,以及是否释放。这个工具定位不是很精确,不能给出调用堆栈等,只能由程序员根据新增对象分析、查找。


第二款工具,GdiLeakDetector,支持xp,win7支持不是很好,可以精确定位GDI泄露位置 下载地址:

使用方法:

1、打开GdiLeakDetector,找到要检测的程序,并点击运行程序按钮




2、进行可能出现泄露的操作,并退出程序,并依次点击左边的GDI泄露列表,看哪个是可以修改的



如上图所示,很容易的找到,在copyclipbrd中有dc泄露,去函数中查看,发现dc是通过CreateCompatibleDC函数创建的,但是释放时用了releaseDC,这是不对的,对于CreateCompatibleDC申请的DC,应该用deletedc释放,而getDC取得的DC资源,用releaseDC释放,不对应的话就会造成GDI泄露。

 

附:GDI使用的几个注意点:

http://blog.csdn.net/bobob/archive/2005/12/29/565188.aspx

1、Create出来的GDI对象,要用Deleteobject释放, create出来的DC,要用DeleteDc释放,getDC得出的DC,用ReleaseDc释放。

2、先create后delete, create1,create2, delete2,delete1的顺序。

3、画图步骤

a 创建一个内存兼容dc(CreateCompatibleDC)
b.创建一个内存兼容bitmap(CreateCompatibleBitmap)
c.关联创建的内存兼容dc和bitmap(SelectObject)
d.画图
e.BitBlt到目的dc上
f.断开内存兼容dc和bitmap关联(SelectObject)
g.销毁内存兼容bitmap
h.销毁内存兼容dc

目录
相关文章
|
8月前
|
IDE 编译器 项目管理
Dev-C++保姆级安装教程:Win10/Win11环境配置+避坑指南(附下载验证)
Dev-C++ 是一款专为 Windows 系统设计的轻量级 C/C++ 集成开发环境(IDE),内置 MinGW 编译器与调试器,支持代码高亮、项目管理等功能。4.9.9 版本作为经典稳定版,适合初学者和教学使用。本文详细介绍其安装流程、配置方法、功能验证及常见问题解决,同时提供进阶技巧和扩展学习资源,帮助用户快速上手并高效开发。
|
负载均衡 网络协议 算法
|
人工智能
开启歌词创作之门:写歌词的技巧和方法详解,妙笔生词AI智能写歌词软件
歌词创作是通往音乐灵魂深处的大门。本文介绍了一些实用技巧,如借助《妙笔生词智能写歌词软件》的AI功能,捕捉生活中的灵感,确定主题,合理安排歌词结构,运用生动的语言和修辞手法,确保韵律和节奏,帮助你轻松开启创作之旅。
|
Java Maven 微服务
【工程】-一文带你使用Gradle构建SpringBoot微服务项目
【工程】-一文带你使用Gradle构建SpringBoot微服务项目
2262 0
【工程】-一文带你使用Gradle构建SpringBoot微服务项目
|
机器学习/深度学习 算法 数据挖掘
数据分享|Python爱彼迎Airbnb新用户体验数据XGBoost、随机森林预测
数据分享|Python爱彼迎Airbnb新用户体验数据XGBoost、随机森林预测
|
SQL 关系型数据库 测试技术
postgresql|数据库|数据库测试工具pgbench之使用
postgresql|数据库|数据库测试工具pgbench之使用
630 0
|
前端开发
react实战笔记85:搜索框结构
react实战笔记85:搜索框结构
192 0
react实战笔记85:搜索框结构
LXJ
|
网络协议 Linux 网络安全
FRP/一款很好用的内网穿透工具-
frp软件介绍,安装部署
LXJ
3871 1
|
Java Android开发 C++
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)
260 0
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)
|
Windows API
.Net程序开发中一个较为隐蔽的GDI泄露探析
最近一直在调试第三方委托开发的医疗输液系统(我接手时,代码已经完成,原则上我只修改接口部分以适应我们的硬件即可,不过调试过程中,该程序本身问题暴露不少),该系统用VB.net开发,该软件的图形界面是花费n多银子专门做的美工,大量的贴图,就是目前的主流PC机配置,也很难在调试模式下走顺溜
1219 0