我有一个进程转储,其中进程中的句柄计数达到了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 ??并键入目录。在这里,我想知道在什么情况下我们会看到这个特定的句柄被创建? 有没有办法知道从完全转储发生泄漏的代码?
答案 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可以捕获每个文件操作的堆栈转储。那当然加快了;你需要学习它的过滤器。