2011-05-17 79 views
0

当我使用!htrace -diff在WinDbg中调试句柄泄漏,我得到了很多的句柄(可能有泄漏的那些)没有显示调用堆栈的:HTRACE没有显示出调用堆栈

可能是什么原因为此,我还有哪些选项需要进一步调试?

Handle = 0x000273e4 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273e0 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273dc - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273d8 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273d4 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273d0 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273cc - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273c8 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273c4 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273c0 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273bc - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273b8 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273b4 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273b0 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273ac - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273a8 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 
Handle = 0x000273a4 - OPEN 
Thread ID = 0x00001190, Process ID = 0x0000114c 

-------------------------------------- 

更新:句柄泄漏似乎取决于图形驱动程序或图形卡。当我使用任何形式的WPF时它开始泄漏,它只在某些带有某些图形卡/驱动程序的Windows XP系统上泄漏。

+0

您正在运行的操作系统是什么? 这是转储还是现场调试? 您之前是否打过'!htrace -enable'? – 2011-10-10 19:54:23

+0

Windows XP,是的,我确实调用了'!htrace -enable'还有另外一个线索:句柄泄漏似乎取决于图形驱动程序或图形卡。当我使用任何形式的WPF时它开始泄漏,它只在某些带有某些图形卡/驱动程序的Windows XP系统上泄漏。 – bitbonk 2011-10-11 05:25:02

+0

您可以使用'!handle 0x000273c4 0xf'来查看有关特定0x000273c4句柄的更多信息。然后,您会知道句柄的类型是您正在寻找的类型。如果泄漏与GDI有关,则它们由另一个句柄池处理,而不在列表中,您可以使用!句柄进行处理。 GDI泄漏是痛苦的,我不知道任何记录的方式来跟踪他们。您可以从NirSoft试用此工具(http://www.nirsoft.net/utils/gdi_handles.html),看看您是否能够缩小问题范围。 – 2011-10-11 07:12:15

回答

1

通过ZwOpenProcess例程(http://msdn.microsoft.com/en-us/library/windows/hardware/ff567022(v=vs.85).aspx)在内核模式下执行调用,并且不会跟随ZwClose电话。然后手柄泄漏。您看不到这些调用堆栈,因为它们仅在从用户模式(OpenProcess/CloseHandle)执行调用时才可用。

在XP SP3上,似乎很难找到罪魁祸首。解决方法是使用OS中构建的“对象引用跟踪”功能,但是此路径存在问题(有关更多参考,请参见http://www.osronline.com/showthread.cfm?link=198302)。既然您发现只有当某个特定的视频卡出现时才会出现此问题,您可以尝试联系供应商或检查驱动程序的更新版本。

+0

ZWopenProcess/ZWClose +1 – bitbonk 2011-10-24 06:02:32