方法一

1、打开电脑的【任务管理器】,选择【进程】页,点击菜单项的【查看】项,选择【选择列】;

2、勾选【GDI对象(J)】即可。

3、此时,用户就可以在进程中看到每个进程对应的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泄漏。

【方法二、三转自】http://hi.baidu.com/bit_qu/item/136682125fe88dfedceecab4

其他工具

GDIView:网盘下载

最新文章

  1. Unity中创建二维码
  2. 转自coolshell--vim的基本操作
  3. Entity Framework数据库初始化四种策略
  4. eclipse菜单解释及中英对照
  5. Chrome扩展开发之四——核心功能的实现思路
  6. 编程规范 html部分
  7. oracle表空间增长异常或表空间占用过高问题分析
  8. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移
  9. [转]如何查询SQL Server连接数
  10. Spring Cloud 自定义ConfigServer
  11. SpringBoot框架与MyBatis集成,连接Mysql数据库
  12. 主席树——树链上第k大spoj COT
  13. 电脑小白和ta的小白电脑
  14. [转]MySQL查询缓存清空
  15. DSB
  16. https学习笔记三----OpenSSL生成root CA及签发证书
  17. mysqldump数据导出问题和客户端授权后连接失败问题
  18. 状态模式-State-订单状态
  19. BZOJ.4766.文艺计算姬(Prufer)
  20. String类的常用方法总结

热门文章

  1. spring JMS在接收消息的时候总是报错
  2. bzoj千题计划212:bzoj1864: [Zjoi2006]三色二叉树
  3. 何凯文每日一句打开||DAY8
  4. 03 uni-app框架学习:轮播图组件的使用
  5. ocky勒索软件恶意样本分析2
  6. 【CTF WEB】反序列化
  7. Linux获取/dev/input目录下的event对应的设备【转】
  8. ApiCloud利用NVTabBar模块快速搭建起APP的框架
  9. KVM -> 虚拟化简介&虚拟机安装_01
  10. poj2054