软件运行中界面显示异常——GDI资源泄漏问题的排查过程
2009-04-02 15:44
573 查看
出错现象:
在同一台电脑上同时运行该应用程序的三个实例,经过两天后,其中的一个实例出现以下问题:
1、主对话框的菜单项变成黑方框,标题栏消失(偶尔),需要鼠标移动后才能显示。
2、对话框控件内容消失。
3、非模态对话框能够打开,模态对话框无法打开。
4、对话框资源不在dll内。
5、正常工作的实例占用内存4M左右,出现异常的实例占用内存不到2M;电脑物理内存512M,工作时,内存占用为630/1024。
找了两天,得到的答案是:
应该是GDI资源释放的问题,例如你使用了CPen, CBrush等,一定要调用x.DeleteObject(),如果使用了new指针也要及时释放。对方运行多个程序才会出现此问题,更加佐证了GDI问题,多个程序切换会导致你的主程序刷新界面,而你的主程序重绘,又要消耗GDI资源。如果只运行你的程序,界面刷新的情况很少甚至没有。
开始的时候没有理解怎样才算做GDI资源泄漏。根据上面回答,对程序中所有使用CPen、CBrush和CDC的地方都进行了排查和修改,仍然存在问题。
内存泄漏的情况是很容易通过进程所占用内存的大小来判断的,如何才能检测GDI资源泄漏呢?
在论坛里发帖咨询后,得到的答案仍然是GDI资源泄漏,所幸的是知道如何去查看GDI资源数量了。即,在“任务管理器”-“查看”-“选择列”中选中“GDI对象”,即可看到各个进程的GDI数量,从而判断程序是否存在GDI资源泄漏的问题。
再次排查时,我发现每打开一个带背景色的对话框都会导致GDI资源数量增加,突然想到OnCtrlColor里返回的画刷的句柄因为是局部变量而没有被释放。改为成员变量,在构造函数中创建画刷,在析构函数中释放画刷资源,问题就这样解决了。
在同一台电脑上同时运行该应用程序的三个实例,经过两天后,其中的一个实例出现以下问题:
1、主对话框的菜单项变成黑方框,标题栏消失(偶尔),需要鼠标移动后才能显示。
2、对话框控件内容消失。
3、非模态对话框能够打开,模态对话框无法打开。
4、对话框资源不在dll内。
5、正常工作的实例占用内存4M左右,出现异常的实例占用内存不到2M;电脑物理内存512M,工作时,内存占用为630/1024。
找了两天,得到的答案是:
应该是GDI资源释放的问题,例如你使用了CPen, CBrush等,一定要调用x.DeleteObject(),如果使用了new指针也要及时释放。对方运行多个程序才会出现此问题,更加佐证了GDI问题,多个程序切换会导致你的主程序刷新界面,而你的主程序重绘,又要消耗GDI资源。如果只运行你的程序,界面刷新的情况很少甚至没有。
开始的时候没有理解怎样才算做GDI资源泄漏。根据上面回答,对程序中所有使用CPen、CBrush和CDC的地方都进行了排查和修改,仍然存在问题。
内存泄漏的情况是很容易通过进程所占用内存的大小来判断的,如何才能检测GDI资源泄漏呢?
在论坛里发帖咨询后,得到的答案仍然是GDI资源泄漏,所幸的是知道如何去查看GDI资源数量了。即,在“任务管理器”-“查看”-“选择列”中选中“GDI对象”,即可看到各个进程的GDI数量,从而判断程序是否存在GDI资源泄漏的问题。
再次排查时,我发现每打开一个带背景色的对话框都会导致GDI资源数量增加,突然想到OnCtrlColor里返回的画刷的句柄因为是局部变量而没有被释放。改为成员变量,在构造函数中创建画刷,在析构函数中释放画刷资源,问题就这样解决了。
相关文章推荐
- IOS开发过程中Xcode编译错误以及运行时异常等问题记录
- 基于TBDS的flume异常问题排查过程
- oracle10g客户端软件在win7运行异常的问题
- 解决自动安装evaQQ软件不显示中文界面问题
- 【软件打包】 Inno Setup -- 修改安装过程的界面显示语言【1】
- 请问:软件运行前的设置界面显示'第一次运行软件,正在设置...'等信息的东东叫什么?如何做出这种东东呢?
- 基于TBDS的flume异常问题排查过程
- 解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题(转)
- EM2040D数据采集软件SIS使用过程中图像实时显示问题(三)
- Android 程序运行后,界面不显示的问题解决办法
- 关于GDI资源使用后未释放,导致GDI对象猛增,程序花屏,异常退出的问题
- 基于TBDS的flume异常问题排查过程
- 1、解决sonar-checkstyle-plugin运行过程中出现的异常问题
- unity game界面和发布之后运行鼠标显示异常
- 软件运行时,任务栏图标显示不正常的问题
- 解决Android启动显示空白界面的问题,自定义进入软件前的背景图片。
- 一个job运行问题的排查过程
- hadoop本地任务运行过程报临时文件找不到问题排查
- 解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!
- MTK平台如何定位显示花屏和界面错乱等绘制异常的问题?