2011-11-28 91 views
4

我不太清楚如何去做这件事。这是一个大型应用程序,我们大多数表单上都有GDI对象“泄漏”。如何调试GDI对象泄漏?

有帮助的工具吗?有关于如何使用这种工具的教程?

我应该直接从表单中删除代码,直到我缩小犯罪人的范围吗? (有很多代码)。

+2

你怎么知道你有GDI对象泄漏? –

+0

@JimMischel我们的应用程序会崩溃,如果我们多次打开和关闭一些表单(在崩溃整个应用程序之前,我们最常用的一种形式是打开/关闭〜75次)。我忘记了确切的错误是什么,但它必须在Windows中处理1000个句柄(1,000是注册表设置,它可以更改为〜32,000)。 我一直在关注这个问题,并持续了几个月的时间(我似乎无法弄清楚我们做错了什么,因此我无法弄清楚如何解决它)。 – XenoPuTtSs

+0

@XenoPuTtSs听起来更像是你需要使用adplus来进行内存转储,并使用winDbg和SOS来查看根本原因。确切的错误显然会非常有帮助。 –

回答

1

原来,我只是使用任务管理器,并试图重现问题。我们的应用程序(和GDI对象泄漏)的问题是我们正在使用静态对象并绑定它。有一个.net 3.5(atleast)的问题,关闭时的表单不知道如何正确处理所有内容,某些图形对象将保留在内存中。

+1

你能否提供你的陈述的来源?是提交的错误?我们可以追踪它吗?谢谢 – sebagomez

+0

我向MSDN提交了一些内容,并且已经关闭,说它不会被修复。但在另一个我的问题(http://stackoverflow.com/questions/8343109/possible-bug-with-net-winforms-or-am-i-just-missing-something-gdi-object-leak)我张贴确切的代码来重现问题。 – XenoPuTtSs

16

仅仅超过GDI对象的10000个对象限制是非常罕见的,当你自己没有调用Dispose()方法时,垃圾回收器会照顾它们。更可能的故障模式超过了Windows的对象限制。在Winforms中,Controls.Clear()或Controls.Remove()可以很容易地做到,当你不明确地处理已删除的控件时,会很快得到你。垃圾收集器无法清理它们。

您可以从Taskmgr.exe进程选项卡中获得一个很好的诊断。查看+选择列并勾选句柄,USER对象和GDI对象。在使用过程中请注意这些数字。其中一个人数稳步攀升是一个肯定的迹象,当它拒绝给你更多的东西时,你会让Windows轰炸你的程序。每个默认配额为10000。 USER对象是指示您有Controls.Clear/Remove问题的对象,GDI对象是指示您正在泄漏System.Drawing对象的对象。 Perfmon.exe是一个很好的工具,用于查看垃圾收集器是否足够频繁地运行以释放未放置的System.Drawing对象。

有一个普遍的观点认为,在需要的地方明确调用Dispose()是一种好的做法。特别是对于Image和Bitmap对象,它们只占用很少的GC内存,但有很多非托管内存,当你不处理它们时很容易用OOM来轰炸一个程序。注意Properties.Resources中的令人讨厌的陷阱,每次使用它时都会得到一个新对象,并且需要处理它。在绘画代码中始终使用using声明。

+0

>> Controls.Clear()或Controls.Remove()会在你没有明确地处理删除的控件时立即得到你。垃圾收集器不能清理它们。“哦,真的吗?怎么会 - 没有人指向它,所以gcoll可以拿起它,为什么不呢? – TheBlastOne

+1

删除的控件通过将它们父母放置到称为“停车窗口”的隐藏窗口保持活动状态。准备好重新进入另一个窗口。非常好的功能,因为它保持原生窗口完好无损。但是这种举动不会发生,或者他们没有被处置,他们会永远泄漏。 –

+0

我正在使用taskmgr.exe,我正在看我的GDI对象越来越高。最终达到极限(10,000),应用程序崩溃(顺便说一下,10,000可通过注册表“HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ GDIProcessHandleQuota”配置) “停车窗口”如果不是,这个功能称为什么? – XenoPuTtSs

1

您可以使用perfmon(windows-> start-> perfmon)来监视GDI泄漏。这有能力监视和记录在csv文件中的数据。

+0

? GDI对象似乎没有被性能计数器跟踪:https://technet.microsoft.com/en-us/library/cc958260.aspx – xverges