.net - 如何找到我的 .Net 应用程序在何处泄漏 Windows 句柄?

标签 .net winforms com xps handles

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

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

虽然内存使用情况很好,但如果我继续像这样耗尽句柄,那么我将使应用程序崩溃,甚至桌面崩溃。

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

关于如何追踪 handle 的去向有任何线索吗?我想我必须简化为单线程控制台应用程序来测试。

问候

瑞恩

最佳答案

虽然单独使用有点贵,但我们使用 ANTS Profiler这对于发现此类问题非常有帮助。您可以下载并尝试试用版。

可能还有其他好的分析器,但这是我熟悉的一个。

关于.net - 如何找到我的 .Net 应用程序在何处泄漏 Windows 句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/231480/

相关文章:

c# - 如何避免通过winform向表中输入重复值?

visual-c++ - 警告 C4278 : 'GetCurrentDirectory' : identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier

C# 无法在 IDE 中启动调试应用程序

带有 .net framework 4.6.1 的 Asp.net Core 2.0 - 找不到引用程序集“.NETFramework/v4.6.1/Microsoft.CSharp.dll”

c# - 如何使用密码控件禁用 Caps Lock 警告?

c# - 如何在文本框为空时输入默认值

c# - MessageBox、C#、Windows 窗体未使用的输入键

c# - C 中 char 点的等效 C# 类型是什么

com - ADODB.Connection 与 "Class does not support Automation"的 Exe 崩溃

.net - 在任何 View 之前添加要运行的代码?相当于母版页页面加载?