【问题标题】:Tracking down COM interface/SysAlloc leaks追踪 COM 接口/SysAlloc 泄漏
【发布时间】:2012-10-19 20:43:01
【问题描述】:

我继承了一些糟糕的 MSXML 解析代码(遗憾的是我没有时间重写)。这段代码充满了 COM 接口/BSTR 泄漏,原作者要么误用了手动 COM 引用计数(这似乎总是以泪水告终),要么他们使用了 COM 智能指针但错误地使用它们导致发生泄漏。

我现在已经修复了代码中的许多漏洞,但我仍然发现当我调用 CoUninitialize() 时 msxml3.dll 没有被卸载(如果所有接口都已消失,则应该是这样)和更多内存这段代码运行后的使用量超出了我的预期。

我现在已经达到了我可以手动发现的极限,我正在四处寻找可以识别此类泄漏的调试解决方案。我过去使用 umdh 发现常规泄漏效果很好,但这似乎对 COM 泄漏没有太大帮助。谁能推荐一个好的方法?

【问题讨论】:

  • 您是否尝试将流程附加到 AppVerifier ?该工具显示每个泄漏的堆栈跟踪。 (您需要有适当的符号才能查看堆栈跟踪)
  • 应用验证程序是否仍然这样做?我确定那里使用了一些 COM 选项,但我在 SDK 7.0 的版本中看不到它们
  • 我有版本 6.2 并且看到 LeaksBasic 测试的一部分。
  • msdn.microsoft.com/en-us/library/sycfy8ec%28v=vs.80%29.aspx 可能会有所帮助,但我认为它不会解决您的所有问题。
  • @Mahesh - 啊,是的,我试过这个,它类似于 umdh,它似乎没有发现 COM 泄漏只有正常泄漏。程序在 appverifier 开启时运行良好。

标签: c++ com msxml


【解决方案1】:

试试 BoundsChecker(Micro Focus 产品)。如果您激活“COM 对象跟踪”功能,它将显示 COM 接口泄漏。它适用于 X86 和 X64 应用程序。就是说,您的里程可能会有所不同:我现在正在清理该代码(这就是我通过 Google 提出您的问题的原因),我们的下一个版本应该会更好。这个特定的代码已经很多年没有被触及了。

关于 SysAlloc 泄漏,这是一个困难的领域,因为 IMalloc 类如何缓存已释放的内存,而不是真正释放它。如果时间和干扰允许,我仍在该领域工作。

披露(如果还不是很明显):我为 Micro Focus 工作,特别是 BoundsChecker。

【讨论】:

  • 有趣的是你对 IMalloc 的看法,我看到了这种行为。
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多