zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    jenkins 配置git
    unittest 出报告 并配合 jenkins,发现有用例错误,但是构建没出现红点 的解决方法
    继承了2个类的使用方法 分别可以调用2个类里面的 方法 和 变量
    让HTMLrunner 报告的子列表都 默认展示出来的 方法(方便发送邮件时可以方便查看)
    Python:删除、增加字典的元素
    类里面变量相互调用的方法
    其他类想使用unittest的断言方法,就import unittest的框架,继承他,使用他里面的方法
    测试用例脚本 测试用例之间变量可以相互用的方法 实例
    测试用例脚本,调用其他模块方法的实例(数据分类 appium 和 selenium 看这里)
    类的继承 讲解
  • 原文地址:https://www.cnblogs.com/lidabo/p/3430221.html
Copyright © 2011-2022 走看看