GDI 泄漏检测方法

方法一

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:网盘下载

GDI 泄漏检测方法,码迷,mamicode.com

时间: 2024-12-27 12:08:24

GDI 泄漏检测方法的相关文章

VS2005内存泄漏检测方法[转载]

一.非MFC程序可以用以下方法检测内存泄露: 1. 程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) #else #define DEBUG_CLIENTBLOCK #endif   // _DEBUG #define _CRTDBG_MAP_ALLOC #include #include #ifdef _DEBUG #define new   DEBUG_CLI

_CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题

我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} normal block at 0x05785AD0, 152 bytes long. Data: << N N x 7 > 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00 Object dump complete.   而且每次退出都是一样的.

简单内存泄漏检测方法 解决 Detected memory leaks! 问题

最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} normal block at 0x05785AD0, 152 bytes long. Data: << N N x 7 > 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00 Object dump complete.   而且每次退出都是一样的.泄漏的内存块都是98500. 解决方法: 1.

Android Native内存泄漏检测方法

Android 检测 C/C++内存泄漏的方法越来越简便了,下面列举一下不同场景下检测C/C++内存泄漏的方法. Android O(针对root设备,调试APP) 1. 准备一个userdebug或eng版本手机,下载native_heapdump_viewer.py脚本备用 2. 执行以下命令 adb shell setprop wrap.<APP_PACKAGE_NAME> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace"' 3. 执行重现

Windows 下的内存泄漏检测方法

在 Windows 下,可使用 Visual C++ 的 C Runtime Library(CRT) 检测内存泄漏. 首先,我们在.c或.cpp 文件首行插入这一段代码: #define _CRTDBG_MAP_ALLOC #include <crtdbg.h> main() 中插入如下的代码: int main() { //开始的地方插入该语句 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); //_CrtSetBr

VS2005 检测内存泄漏的方法(转载)

一.非MFC程序可以用以下方法检测内存泄露: 1.程序开始包含如下定义: [cpp] view plain copy print? #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) #else #define DEBUG_CLIENTBLOCK #endif  // _DEBUG #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #includ

VS中检测内存泄漏的方法

vs中检测内存泄漏的方法 分类: MFC2013-03-08 21:44 2764人阅读 评论(0) 收藏 举报 使用vs的内存检测有以下几种方法. 在debug模式下以F5运行: 方法一: [html] view plaincopy #define CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> //在入口函数中包含 _CrtDumpMemoryLeaks(); //即可检测到内存泄露 //以如下测试函数为例: i

c/c++内存泄露的检测方法

此文内容摘自 https://zhuanlan.zhihu.com/p/22664202 作为   从零开始的 JSON 库教程(三):解析字符串解答篇  的笔记 1A. Windows 下的内存泄漏检测方法 在 Windows 下,可使用 Visual C++ 的 C Runtime Library(CRT) 检测内存泄漏. 首先,我们在两个 .c 文件首行插入这一段代码: #ifdef _WINDOWS #define _CRTDBG_MAP_ALLOC #include <crtdbg.h

内核对象&amp;句柄&amp;泄漏&amp;检测

今天看到这个问题如何评价王垠的 <讨厌的 C# IDisposable 接口>? - 王垠(人物),答案被歪到windows 内核对象和句柄,答案中谈的太浅显而且有误.翻出陈年老文章(此文成于2012年,只在公司内部分享过),大部分内容来自Windows内核原理 1句柄和句柄泄露 在Windows编程过程中,很多时候我们都要和句柄打交道,比如窗体句柄,内核对象句柄,GDI句柄,Windows Multimedia库中的多种句柄等等,以及其他更多未曾使用过的句柄类型.句柄(Handle)是Win