【问题标题】:Debugging memory leaks in Windows Explorer extensions调试 Windows 资源管理器扩展中的内存泄漏
【发布时间】:2011-04-03 00:56:41
【问题描述】:

大家好,

我是一个相当大的 C# Windows Explorer 扩展的开发者。可以想象,涉及到很多 P/Invoke,不幸的是,我已经确认它在某处泄漏了非托管内存。但是,我对如何找到泄漏点一无所知。我尝试关注this helpful guide,它说要使用WinDBG。但是,当我尝试使用 !heap 时,它不会让我这样做,因为我没有 explorer.exe 的 .PDB 文件(显然,公共符号文件还不够)。

帮助?

【问题讨论】:

  • 您不应该使用 C# 编写 shell 扩展。有关说明,请参阅blogs.msdn.com/b/oldnewthing/archive/2006/12/18/1317290.aspx
  • 感谢您的回复。但是,您引用的链接已过时。 C# 中的 Shell 扩展曾经不是一个好主意,因为它们可能导致 CLR 被注入到任何包含 shell 对话框的随机进程中。如果该进程加载了不同版本的 CLR,则两者会发生冲突。但是,.NET 4 现在支持多个 CLR 版本的内存中并行操作,这意味着不再有任何问题。此外,我的扩展是一个工具栏,它只加载在资源管理器中,而不是任何其他进程。

标签: memory-leaks windbg windows-explorer


【解决方案1】:

我用过很多次UMDH,效果非常好。您提到的描述 WinDbg 的指南使用与 UMDH 相同的方法,基于调试堆记录所有分配的堆栈跟踪的能力。唯一的区别是 UMDH 是自动化的——您只需从命令行运行 umdh,它就会创建所有当前分配的快照。通常您重复快照两次或多次,然后计算两个快照之间的“增量”(也使用 umdh.exe)。 'delta' 文件上的信息为您提供快照之间发生的所有新分配,按分配大小排序。

UMDH 也需要符号。您至少需要 ntdll.dll 的符号(堆实现在那里)。 http://msdl.microsoft.com/download/symbols 的公共符号上可用的公共符号可以正常工作。

确保您使用的是正确的 umdh.exe 位数。 Explorer.exe 在 64 位操作系统上是 64 位的,因此如果您的操作系统是 64 位,则需要使用 64 位 umdh.exe -- 即下载适当位数的 Windows 调试工具。

【讨论】:

  • 哇,这太棒了。谢谢!我现在应该可以通过一些工作来追踪它。但是如果 UMDH 使用与 WinDBG 相同的方法,我想知道为什么它起作用了,而 WinDBG 却没有?
猜你喜欢
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
相关资源
最近更新 更多