我必须调查.NET应用程序中发生的句柄泄漏,并且只有一个内存转储供我使用。我无法进行任何实时调试或监控。
我在Visual Studio 2015,.NET Memory Profiler和Windbg中打开转储文件。我可以列出Windbg中的100k打开句柄,其中大多数是Thread句柄:
0:000> !handle 0006aaf8 f
Handle 0006aaf8
Type Thread
Attributes 0
GrantedAccess 0x1fffff:
Delete,ReadControl,WriteDac,WriteOwner,Synch
Terminate,Suspend,Alert,GetContext,SetContext,SetInfo,QueryInfo,SetToken,Impersonate,DirectImpersonate
HandleCount 3
PointerCount 5
Name <none>
Object specific information
Thread Id 1f24.1ce1c
Priority 10
Base Priority 0
之后,我被困住了。我不知道如何处理这个线程ID&#34; 1f24.1ce1c&#34;,它似乎与!线程中的任何东西都匹配(总共74个线程)。我也没有看到任何关于我的托管记忆的怀疑。一些指南建议使用!htrace进行进一步调查,但如果我没有弄错,那只有在附加到正在运行的进程时才有效。
如果有任何建议,我将不胜感激。
答案 0 :(得分:0)
查看本机句柄,我猜你看的线程ID也是本机的。在您的示例中,1f24可能是您也可以看到键入管道“|”的进程ID,而1ce1c是本机ThreadId,它与!threads所示的托管ThreadId不同。你可能会看到ThreadId是否匹配一个运行'〜'命令的静止线程。
如果不启用句柄跟踪!htrace,在原生轨道上跟随将会很复杂。 DebugDiag可以像其他建议一样提供帮助,并且作为句柄跟踪影响较小,因为它只是挂钩分配函数。
否则,如果您认为可能与您的.NET代码有关,我建议您尝试在管理方面寻找一些线索。你不能将这个本机线程泄漏与托管对象泄漏联系起来吗?一个!dumpheap -stat没有显示大量的System.Threading.Thread,System.Windows.Forms.Application + ThreadContext,System.Windows.Forms.Control + ControlNativeWindow等?如果您可以将此类托管对象关系与您的本机句柄泄漏联系起来,那么至少您可以跟踪这些对象的GC引用(!gcroot)以获得更多线索。