从Visual Studio调试器中检测GDI泄漏是否可能?

27

可以从任务管理器或Process Explorer中看到GDI对象的泄漏。(虽然您看不到泄漏,但可以看到对象使用计数是否持续增加。)

还有一些工具可以按类型查看GDI对象,例如GDIView [a]、DeLeakerDPUSGDIDebug(源代码)

[a]请注意,我认为GDIView是一个很好的工具,可以识别和确认GDI泄漏的存在,但它无法帮助您在大型应用程序中找到泄漏代码。(我也要指出这个工具运行得非常好,并且表现良好,尽管它的主页有点奇怪(-:)

还有一个名为leaktrap的WinDBG插件,它使用MS的Detours库

我还知道(并使用过)AQTime的资源分析器,可以检测应用程序中的GDI(和其他)资源泄漏,并提供泄漏调用的堆栈跟踪。

现在,我的实际问题是: 在VC++调试器中是否可能检测出泄漏的GDI对象? 这样就不需要单独的工具,可以在正常调试过程中捕获GDI泄漏,而不必单独检查。


1
如果我可以给这个问题点赞两次,我一定会的。除了是一个好问题外,你还提供了大量的优秀信息。 - tenfour
3个回答

9
GDI对象不需要逐个检查(并非真的不需要),它们可以由Deleaker负责 - 这样您就会知道泄漏的位置。仔细阅读说明并观看演示视频:http://deleaker.com/

为什么你会说“它们不必逐个检查”?如果应用程序没有正确释放GDI对象,则我当然希望找出哪些代码在泄漏……?!! - Martin Ba
2
我个人没有尝试过这个,但无论如何我会将其标记为答案。 - Martin Ba
真是糟糕透了!安装后,独立应用程序立即崩溃,VS插件显示一个空窗口!我有这是假的印象。他们还要3999美元的站点许可证!荒谬!应用程序中发生未处理的异常。程序集“DeleakerLibrary, Version=3.0.92.0, Culture=neutral, PublicKeyToken=cd8e4da67e0a5d66”中类型“DeleakerLibrary.ObjectsControl”的方法“get_CanEnableIme”正在覆盖一个不可见的方法。 - Elmue
1
如果您谷歌搜索“Method get_CanEnableIme on”,您会发现这是一个相当典型的问题。要解决这个问题,只需安装 .Net 运行时的 SP1 版本即可。 - Artem Razin
1
一个价格昂贵的软件应该能够检查它运行的环境,并向用户提供智能错误消息。更加智能的软件甚至可以直接在安装程序中检测到该问题,并告诉用户他必须安装SP1。但是抛出异常真的是很糟糕的编程方式。 - Elmue

3

Intel Parallel Inspector是一款内存泄漏检测工具,可以在Visual Studio中使用,并能够检测GDI泄漏。


这个是扩展了现有的 Visual Studio 调试器,还是一个“仅仅”与 Visual Studio 集成的独立工具(例如 AQTime)? - Martin Ba
1
一个内存泄漏检查器和调试器是两个不同的东西... 是的,它“只是”与Visual Studio集成。 - ronag

0

Visual Studio没有针对非托管应用程序的内置内存分析器。

这是确认的。


这个问题是关于GDI资源的,而不是内存。 (而且VC ++确实有内置工具来跟踪本机代码中的内存泄漏。) - Adrian McCarthy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接