如何找到我的.Net应用程序泄漏Windows句柄的位置?

时间:2008-10-23 20:53:05

标签: .net winforms com xps handles

我有一个运行在大量XPS文档(数千个)上的WinForms .Net应用程序,在此运行期间,每个文档的句柄数量(根据sysinternals进程监视器和任务管理器)增加3-10个。我非常怀疑这些是MS .Net XPS框架库打开但未关闭的句柄,但我无法追踪它。

尽管逐步执行代码,但在同一次运行期间,句柄计数会在不同点增加。例如,一个遍历循环,句柄计数将在一行上跳过1,下次可能不会,或者它可能会跳过2.所以我怀疑XPS com组件有句柄泄漏。

虽然内存使用很好,但如果我继续使用这样的手柄,那么我会崩溃应用程序,也许桌面崩溃。

到目前为止,我已经尝试使用sysinternals进程资源管理器查看句柄,但它们都标记为没有更多详细信息。还使用了sysinternals中的handle.exe,这在快照之前,期间和之后都没有显示出任何显着的差异。

有关如何追踪手柄走向的任何线索?我想我将不得不简化为单线程控制台应用程序进行测试。

此致

赖安

4 个答案:

答案 0 :(得分:1)

可能是愚蠢的,但你有没有检查过你是否处理了一次性的东西?

答案 1 :(得分:1)

虽然单数使用有点贵,但我们使用ANTS Profiler,这对于找到这样的问题非常有帮助。您可以下载并试用试用版。

也可能有其他优秀的个人资料,但这是我熟悉的。

答案 2 :(得分:0)

那么,您是否忘记删除从包存储中创建的XPS文档?那么MemoryStream用来支持你的包呢?

答案 3 :(得分:0)

我有很好的经验使用YourKit .net profiler诊断出这种错误。强烈推荐 - 它相对便宜,它甚至可以很好地处理C ++ - CLI(我已经尝试了其他诸如dottrace from jetbrains之类的拒绝或完全崩溃的人)。