【问题标题】:What can cause section handle leaks?什么会导致部分句柄泄漏?
【发布时间】:2011-10-21 07:53:53
【问题描述】:

这是my previous question.的后续问题

按照this answer to my previous question 中的建议,我使用ProcessExplorer 来分析我的应用程序用来查找句柄泄漏的句柄列表。

泄漏的句柄属于 Section 类型。

节句柄到底是什么,它在哪里使用以及什么会导致节句柄泄漏?

我没有在我的代码中使用内存映射文件。

【问题讨论】:

  • 你你没有使用内存映射文件,是其他人吗?您正在使用哪些组件?有第三方dll吗?

标签: windows delphi delphi-xe handle resource-leak


【解决方案1】:

引用 Mark Russinovich 的 Inside Windows 2000(现在称为 Windows Internals),

节对象,Win32子系统称为文件映射对象,表示两个或多个进程可以共享的内存块。

所以,它是一个内存映射文件。如果您创建了一个内存映射文件并且未能关闭它,它们就会泄漏。很难说得更具体。

【讨论】:

  • 谢谢。坏消息是:我根本没有使用内存映射文件:(
【解决方案2】:

原来问题出在一个计算当前进程线程数的低级函数中。这个函数使用了

CreateToolhelp32Snapshot

返回未正确关闭的句柄的 API 函数。我不确定为什么这会产生部分句柄泄漏。

【讨论】:

  • 对,但这是对节句柄泄漏的一种相当出人意料的解释,因此它至少回答了部分问题。
【解决方案3】:

与文件句柄无关的内存映射文件可用于 IPC(进程间通信)。如果您不直接使用它们,那么您的某个单元或组件可能正在执行一些 IPC 通信。很可能你使用一个组件连接到另一个进程,并没有按要求释放它。

首先要采取的措施是跟踪任何内存泄漏(使用 FastMM4 调试模式),您肯定会在代码中找到一些未释放的对象。

由于句柄通常由对象分配,根据我的实验,解决所有内存泄漏将解决句柄泄漏。

如果您没有任何内存泄漏,有一些CreateFileMapping() 调用来检查您所有源代码(包括第三方源代码)中对应的CloseHandle()

【讨论】:

    【解决方案4】:

    .net 中的部分句柄泄漏是由于 Microsoft 修补程序 KB2670838。 卸载此更新,将修复部分句柄泄漏问题(内存不足)。

    Parameter is not valid. at System.Drawing.Image.get_Width()
    at System.Drawing.Image.get_Size()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多