我已经崩溃甩的应用程序,据称的泄漏GDI。该应用程序运行在XP和我有任何问题载入WinDbg来看待它。以前我们用的 Gdikdx.dll 扩展 看Gdi的信息,但这种扩展是不支持或XP。

没有任何人有任何针对找到GDI对象的使用在WinDbg.

或者,我们的访问失败的程序(及其应力测试)所以我可以重现对一个正在运行的系统如果你知道任何"现场"调试工具XP和Vista(或Windows2000虽然这不是我们的目标)。

有帮助吗?

解决方案

几年前有一篇 MSDN杂志文章谈到GDI漏洞。这指向了几个具有良好信息的不同地方。

在WinDbg中,您也可以尝试!poolused 命令获取一些信息。

从崩溃转储(验尸)中查找资源泄漏可能很困难 - 如果它总是在同一个地方,使用泄漏内存的相同变量,你很幸运,你可以看到最后的地方它将被泄露等等。在调试器下运行实时程序可能会容易得多。

您也可以尝试使用 Microsoft Detours ,但许可证并不总是有效出。它也更具侵略性和先进性。

其他提示

我已经花了最后一周的工作GDI泄漏搜索工具。我们还定期进行压力测试,它从来没有持续时间超过一整天的值得w/o停止由于用户/gdi对象,处理过度消费.

我已经尝试很成功,因为我可以告诉。当然,我花了一些时间事先寻找替代和更快的解决方案。值得一提的是,我有一些前面的半幸运的经验与GDILeaks工具,从msdn文章上面提到的。更不要说我已经解决的几个问题之前把它的工作和这个时候,它只是没给我什么和如何我想要的。的缺点,其方法是重量级的调试器的接口(它减慢的研究目标的数量级而我发现不可接受的).另一个缺点是,它没有工作的所有时对一些运行,我只是不能得到它的报告中/计算任何东西!其复杂性(通过量的代码),是另一个吓走的因素。我不是一个大风扇的图形用户界面,因为这是我的信念,我更有成效的没有窗户;o)。我还发现,它很难使其找到并使用我的符号。

一个工具,我用之前设置在写我自己的,是的 leakbrowser.

不管怎么说,我最后解决的一个迭代方法来实现下列目标:

  • 次要性的惩罚
  • 执行简单
  • 非侵入(使用多种产品的)
  • 依靠尽可作为可能的

我用走弯路(非商用目的)的核心功能(这是一个injectible DLL)。把Javascript使用的自动代码生成(15K脚本代100K源代码-没办法,我的代码这个手动并没有C的预处理器参与进来!) 加windbg扩展数据分析和照/差异的支持。

告诉很长的故事短后,我已经完成,这是一个几小时收集的信息在另一个压力测试和另一个小时来分析和解决的泄漏。

我会乐于分享我的调查结果。

P.S.有些时候我有没有花在试图改善在以前的工作。我的意图是最大限度地减少误报(我看到的只是约过多的那些同时发展),因此它也会检查的分配/释放的一致性,以及避免考虑到分配是永远不会泄露。

编辑:找到的工具 在这里,

我为此创建了一个Windbg脚本。看看

的答案

获取GDI句柄的命令从崩溃转储计数

要跟踪分配堆栈,您可以设置一个ba(Break on Access)断点,超过最后分配的GDICell对象,以便在发生另一个GDI分配时突破。这可能有点复杂,因为地址发生了变化,但它足以找到任何泄漏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top