从内存转储中专门研究.NET应用程序中的句柄泄漏

时间:2016-07-18 15:19:19

标签: .net memory-leaks handle

我必须调查.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进行进一步调查,但如果我没有弄错,那只有在附加到正在运行的进程时才有效。

如果有任何建议,我将不胜感激。

1 个答案:

答案 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)以获得更多线索。