0

我正在尝试调试 .Net 服务中的句柄泄漏,但我对线程句柄泄漏感到困惑。有人可以描述一下这是怎么发生的吗?任务管理器在每个测试周期后仅报告 22 个活动线程,但句柄数不断增加。

我在每个测试周期之后和获取句柄计数之前发送一条消息强制 GC。

当然,还有一个事件句柄泄漏,但这更容易解释/修复。

D:\log\SEEService>handle -p 82080 -s

Handle v3.46
Copyright (C) 1997-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

Handle type summary:
  ALPC Port       : 8
  Desktop         : 1
  Directory       : 3
  EtwRegistration : 35
  Event           : 97397
  File            : 36
  IoCompletion    : 3
  Key             : 38
  KeyedEvent      : 1
  Mutant          : 9
  Section         : 23
  Semaphore       : 15
  Thread          : 22845
  Timer           : 5
  Token           : 1
  TpWorkerFactory : 4
  WindowStation   : 2
Total handles: 120426
4

2 回答 2

0

This link might still be relevant: Thread handle leak. Have you tried calling GC.WaitForPendingFinalizers() after GC.Collect()?

于 2012-04-17T08:05:00.457 回答
0

我发现了这个错误 :) 我从执行路径中删除了一个和一个模块,并找到了“坏”模块。它是一个通信模块,它是经典的“将对象添加到列表,但未删除”错误 :) 线程句柄 ++ 无法被 GC 处理,因为列表包含对对象的引用。谢谢回复

于 2012-04-18T07:23:32.400 回答