2008-10-23 37 views
4

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

尽管单步执行代码,在同一次运行过程中,处理计数会在不同点增加。例如,一次循环和句柄计数将在一行上跳1,下次可能不跳,或者它可能跳2。所以我怀疑XPS com组件有句柄泄漏。

虽然内存使用情况良好,但如果我一直用尽这种手柄,那么我会崩溃的应用程序,也许桌面。

到目前为止,我已经尝试sysinternals进程资源管理器来查看句柄,但它们都被标记为没有更多的细节。还使用了sysinternals的handle.exe,这并不显示快照之前,之间和之后的任何显着不同。

任何关于如何追踪手柄的线索?我想我将不得不简化为单个线程控制台应用程序来测试。

问候

瑞安

回答

1

可能愚蠢,但你检查,你的一切处置这是一次性的?

+0

是的,正如我所说的,内存使用现在可以了(在COM XPS调用中泄漏有很多问题),所以我认为这种配置不是问题。我非常怀疑XPS的东西,但我还不能证明它。 – 2008-10-23 21:03:27

+2

Dispose并不真正处理内存 - 它更多的是释放非托管资源(句柄)。我不是说它*是*,但它值得检查。 – 2008-10-24 06:32:06

+0

+1 - 使用FxCop帮助检测可能无法处理的地方。 – Joe 2008-10-24 06:48:54

1

尽管单数用途有点昂贵,但我们使用ANTS Profiler,这对于找到类似的问题非常有帮助。你可以下载并试用试用版。

这里也可能有其他好的分析器,但这是我熟悉的。

0

那么,你忘了从PackageStore中删除已创建的XPS文档吗?那么用什么MemoryStreams来支持你的包呢?

0

我已经有很好的经验,使用YourKit .net profiler来诊断这种故障。强烈推荐 - 它相对便宜,它甚至可以很好地处理C++ - CLI(我尝试了其他方法,如dottrace from jetbrains,它们被拒绝或者完全崩溃)。

相关问题