何时是名为\ GLOBAL的句柄?被建造?

时间:2010-09-06 13:49:55

标签: c++ windows memory-leaks handle

我有一个进程转储,其中进程中的句柄计数达到了1600万个句柄(这是每个进程允许的最大句柄数)。因此这个过程被绞死了。

来自转储(这是句柄数量很高但不是最大限制的第二个转储。)我得到以下数据:

53778 Handles 
Type            Count    
None            2    
Event           238    
Section         3    
File            84    
Port            16    
**Directory       53120**    
Mutant          35    
WindowStation   2    
Semaphore       151    
Key             42    
Token           4    
Process         1    

0:000> !handle 9735 f    
Handle 00009735    
  Type          Directory    
  Attributes    0x10    
  GrantedAccess 0x1:    
  HandleCount   53575    
  PointerCount  53788    
  Name          \GLOBAL??
  No object specific information available

有很多这样的句柄打开名称:\ GLOBAL ??并键入目录。在这里,我想知道在什么情况下我们会看到这个特定的句柄被创建? 有没有办法知道从完全转储发生泄漏的代码?

3 个答案:

答案 0 :(得分:2)

我相信你正在使用WinDBG。

如果我没错,“\ GLOBAL ??”表示您的符号链接与所有会话相关。在Win2K上它是“\ ??”。符号链接和句柄可以是会话的本地链接。举个例子:我可以创建一个Mutex句柄,并使其成为每个终端服务会话的本地句柄。这可以通过使用“Global”或“Local \”显式地为互斥锁名称添加前缀来在全局或本地会话名称空间中创建对象来完成。 http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx

答案 1 :(得分:1)

这是可重复的吗?如果是这样,您应该尝试!htrace extension

答案 2 :(得分:1)

在Windows NT中,旧的DOS文件系统本质上是一组快捷方式。这是必要的,因为它是一个多用户文件系统。您的H:\驱动器可能与其他人H:\驱动器不同。因此,两者都实现为快捷方式或符号链接。

SysInternals Process Monitor具有句柄视图,IIRC可以捕获每个文件操作的堆栈转储。那当然加快了;你需要学习它的过滤器。